DP를 이용해서 해결하였다. map에 key는 숫자, value에는 더해서 key를 만들 수 있는 리스트를 저장하였다.
0부터 target까지 만들 수 있는 숫자의 조합을 계속 더해가면서 문제를 해결하엿다.
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Map<Integer, List<List<Integer>>> map = new HashMap<>();
for (int i = 0; i <= target; i++) {
for (int j = 0; j < candidates.length; j++) {
int idx = i - candidates[j];
// 후보 숫자와 전에 있는 숫자들과 더해서 i 가 되는 경우
if (idx >= 0) {
List<List<Integer>> beforeList = map.get(idx);
if (beforeList != null) {
List<List<Integer>> curList = map.getOrDefault(i, new ArrayList<>());
for (int k = 0; k < beforeList.size(); k++) {
List<Integer> list = new ArrayList<>();
list.addAll(beforeList.get(k));
// 중복을 피하고 오름차순으로 후보군을 만들기 위함이다.
if (candidates[j] >= list.get(list.size() - 1)) {
list.add(candidates[j]);
curList.add(list);
}
}
if (!curList.isEmpty())
map.put(i, curList);
}
}
// 후보 숫자가 바로 i 가 되는 경우
if (i == candidates[j]) {
List<List<Integer>> curList = map.get(candidates[j]);
if (curList == null) {
curList = new ArrayList<>();
}
List<Integer> item = new ArrayList<>();
item.add(candidates[j]);
curList.add(item);
map.put(candidates[j], curList);
}
}
}
return map.getOrDefault(target, new ArrayList<>());
}
}
반응형
'Algorithm > LeetCode' 카테고리의 다른 글
[c++] 41. First Missing Positive (0) | 2022.10.19 |
---|---|
[Java] LeetCode 46번 permutation (0) | 2021.10.11 |
[Java] LeetCode 34번 Find First and Last Position of Element in Sorted Array (0) | 2021.10.03 |
[Java] LeetCode 33번 Search in Rotated Sorted Array (0) | 2021.10.02 |
[Java] LeetCode 25번 Reverse Nodes in k-Group (0) | 2021.09.30 |