알고리즘
재귀, dp
유형
조합
문제
candidates = 서로다른 정수들
target = 타겟 정수
return = 더해서 타겟정수가 나오는 모든 유니크한 candidate 조합.
예제
Input: candidates = [2,3,6,7], target = 7
Output: [[2,2,3],[7]]
문제풀이
이 문제는 nCr의 n과 r이 정해져있지 않는 조합이다.
보통의 조합이라면
n개의 요소에서 r개를 뽑는 조합이지만,
이런 문제는 어떻게 풀어야하지?
~~우선 기본적인 조합을 구현하는 코드를 써서 수정을 하는 아이디어로 가보기로 했다.
~~
이런 아이디어가 아니었다.
r이 동적으로 들어가고, 요소가 중복으로 들어가기 때문에 조합이라는 개념에도 맞지 않는다.
이름만 combination..
어떻게 풀면 좋을까?
고민을 하다가, 알고달레에서 두가지 방법을 찾게 되었다.
탈출조건
동작원리
var combinationSum = function(candidates, target) {
const result = []
const nums = []
const dfs = (start,total) => {
if(total > target) return
if(target == total) {
result.push([...nums])
return
}
for(let i=start;i<candidates.length;i++){
const num = candidates[i];
nums.push(num);
dfs(i,num + total)
nums.pop()
}
}
dfs(0,0)
return result
};
그래서 동작원리는 이렇다
/**
* @param {number[]} candidates
* @param {number} target
* @return {number[][]}
*/
var combinationSum = function(candidates, target) {
const dp = [];
for(let i=0;i<target+1;i++){
dp[i] = [];
}
dp[0] = [[]]
for(let candidate of candidates){
for(let num = candidate;num<target+1;num++){
for(let combination of dp[num - candidate] ){
dp[num].push([...combination,candidate])
}
}
}
return dp[target]
};
참고자료
https://www.algodale.com/algorithms/recursion/
https://www.algodale.com/problems/combination-sum/
https://leetcode.com/problems/combination-sum/description/