코딩테스트 준비/leetcode

39. Combination Sum

MAKGA 2021. 11. 7. 15:08
320x100

 

https://leetcode.com/problems/combination-sum/

 

Combination Sum - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

고유한 정수 목록과 목표 값이 주어졌을 때, 요소들의 합으로 목표 값을 만족하는 부분 목록을 구하는 문제다.

풀어봤던 유형이지만 너무 오랜만에 풀어서 그런지 삽질을 좀 했다.

 

주요 고민 포인트로는

1. 요소를 중복으로 사용할 수 있기 때문에 매번 목록의 현재 위치부터 돌며 목표 값을 계산해야 했다.

2. [1,2,3]과 [3,2,1]은 동일한 결과로 치기 때문에 역으로 계산하면 안된다.

2가지 였다.

 

이런 포인트들을 위해 먼저 주어진 목록을 정렬하고 순차대로 돌며 계산한다.


class Solution
{
public:
    void solve(vector<int>& candidates, int index, int target, std::vector<std::vector<int>>& ret, vector<int>& sub_ret) {
        if (target == 0)
        {
            ret.push_back(sub_ret);
            return;
        }

        // point2. 역순 계산 방지를 위해 시작 지점을 특정 위치로 지정 후 증가만
        for (int i = index; i < candidates.size() && target >= candidates[i]; ++i)
        {
            sub_ret.push_back(candidates[i]);
            // point1. 요소의 중복 사용이 가능하기 때문에 i+1이 아닌 i로 전달
            solve(candidates, i, target - candidates[i], ret, sub_ret);
            sub_ret.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if (candidates.empty())
            return vector<vector<int>>();

        if (candidates.size() == 1 && candidates.at(0) == target)
            return vector<vector<int>> { candidates };

        sort(candidates.begin(), candidates.end());
        vector<vector<int>> ret;
        vector<int> sub_ret;
        solve(candidates, 0, target, ret, sub_ret);
        return ret;
    }
};

 

320x100

'코딩테스트 준비 > leetcode' 카테고리의 다른 글

92. Reverse Linked List II  (0) 2021.11.10
40. Combination Sum II  (0) 2021.11.09
21. Merge Two Sorted Lists  (0) 2021.09.22
20. Valid Parentheses  (0) 2021.09.21
90. Subsets II  (0) 2021.09.01