이 글은 "파이썬 알고리즘 인터뷰 (박상길 지음)"을 읽고 주관적으로 요약한 글입니다.
문제 정의
숫자 집합을 중복 포함 조합하여 합이 target이 되는 원소들 나열
책에서 구현된 코드
def combinationSum(self, candidates: list[int], target: int) -> list[list[int]]:
result = []
def dfs(csum, index, path):
if csum < 0:
return
if csum == 0:
result.append(path)
return
for i in range(index, len(candidates)):
dfs(csum - candidates[i], i , path + [candidates[i]])
dfs(target, 0, [])
return result
기억해야할 기법
- 중복되는 숫자가 없는 배열의 조합을 구할 때, 재귀시 현재 index부터 탐색
- 중복되는 값이 없으므로, 중복된 조합 검사가 필요 없음
- sorting이 필요 없음
내가 구현한 코드
def combinationSum(self, candidates: list[int], target: int) -> list[list[int]]:
nums = sorted([n for n in candidates if n <= target], reverse=True)
result = []
def get_sum(elts: list, sum: int, s: int):
if sum == target:
tmp_res = sorted(elts[:])
if tmp_res not in result:
result.append(tmp_res)
return
for i in range(s, len(nums)):
num = nums[i]
if sum + num <= target:
elts.append(num)
get_sum(elts, sum+num, s)
elts.pop()
get_sum([], 0, 0)
return result
- 재귀할 때 검사 시작 인덱스를 바꾸려고 파라미터를 넣고서, 그 값을 그대로 넣었다
- 처음부터 검사해서 정답은 나왔는데, 속도 차이가 컸다
- 원인을 찾으려고 이것저것 해보았다
- 중복검사가 필요할 줄 알고, dict로 검사를 넣었는데 필요가 없었다
- 중복검사를 추가해도 dict라 그런지 속도차이는 거의 없었다
'책읽기' 카테고리의 다른 글
[파이썬 알고리즘 인터뷰][그래프] 일정 재구성 (0) | 2021.07.30 |
---|---|
[파이썬 알고리즘 인터뷰][그래프] 부분 집합 (0) | 2021.07.29 |
[파이썬 알고리즘 인터뷰][그래프] 조합 (0) | 2021.07.29 |
[쉽게 배우는 운영체제](요약)[Part-3][Ch-9] 가상 메모리 관리 (0) | 2021.07.29 |
[쉽게 배우는 운영체제](요약)[Part-3][Ch-8] 가상 메모리의 기초 (0) | 2021.07.29 |