ddoolog

LeetCode | 39. Combination Sum (*Back Tracking)

2024-04-06 at Algorithm category

문제

(링크)

고유한 정수 배열 candidates와 정수 target이 주어졌을 때, 선택한 숫자의 합이 target이 되는 모든 고유한 candidates 조합을 반환합니다. 조합의 순서는 상관없습니다.

candidates에서 같은 숫자를 횟수 제한 없이 선택할 수 있습니다. 선택한 숫자 중 하나 이상의 빈도가 다른 경우 두 가지 조합은 고유합니다.

테스트 케이스는 주어진 입력에 대해 목표에 합산되는 고유 조합의 수가 150개 미만이 되도록 생성됩니다.

풀이

def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
    result, nums = [], []

    def dfs(start, total):
        if total > target:
            return

        if total == target:
            return result.append(nums[:])

        for i in range(start, len(candidates)):
            num = candidates[i]
            nums.append(num)
            dfs(i, total + num)
            nums.pop()

    dfs(0, 0)
    return result

Back Tracking
백트래킹 기법은 조건을 만족하지 않는 경우 해당 경로를 더이상 탐색하지 않는다. 가지치기(pruning) 와도 같다.
구현하고자 하는 탐색 방식에서 조건문을 추가해 노드의 유망성(promising) 을 판단하고 그렇지 않은 경우 빠져나간다.

참고

백준 N-Queen 문제가 백트래킹의 대표적인 문제라고 한다. 도전해 보자.

ddooyn

Personal blog by ddooyn.

Keep Dev Swimming 🌊🏊️