배움 저장소

[LeetCode] 039 Combination Sum 본문

PS/LeetCode

[LeetCode] 039 Combination Sum

시옷지읏 2021. 11. 8. 06:48

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. Backtracking 사용

 한 번 정리한 코드. 처음엔 Set을 사용했다. for문을 돌 때 현재 층(index)부터 시작하면 중복되는 경우의 수를 탐색하지 않아 Set을 사용할 필요가 없다.

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        countUsed = vector<int>(candidates.size(), 0);
        
        backtraking(candidates, target, 0);
        
        return result;
    }
    
private:
    vector<int> countUsed;
    vector<vector<int>> result;
    
    void backtraking(vector<int>& nums, int target, int index)
    {
        if(target<0) return;
        else if(target==0)
        {
            vector<int> temp = vector<int>(0,0);
            for(int i=0; i<countUsed.size(); ++i)
            {
                int countSaved =0;
                while(countUsed[i] >0)
                {
                    countUsed[i]--;
                    countSaved++;
                    temp.push_back(nums[i]);
                }
                countUsed[i] = countSaved;
            }
            
            result.push_back(temp);
            return;
        }
        // 현재 층부터 시작해야 중복되는 경우의 수를 탐색하지 않는다.
        for(int i=index; i<nums.size(); ++i)
        {
            countUsed[i]++;
            backtraking(nums, target-nums[i],i);
            countUsed[i]--;
        }
    }
};

 

방문한 index를 저장하지 않고 해당 값을 바로 넣어주자.

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        backtraking(candidates, target, 0);
        return result;
    }
    
private:
    vector<int> combi;
    vector<vector<int>> result;
    
    void backtraking(vector<int>& nums, int target, int index)
    {
        if(index == nums.size() || target<0) return;
        else if(target==0)
        {
            result.push_back(combi);
            return;
        }
        
        for(int i=index; i<nums.size(); ++i)
        {
            combi.push_back(nums[i]);
            backtraking(nums, target-nums[i],i);
            combi.pop_back();
        }
    }
};

 

2 for문을 사용하지 않고 call stack을 더 깊게 파는 방법이 있다.

첫 번째 재귀함수 호출과 두 번째 재귀함수 호출의 parameter를 주의해서 넘기자

class Solution2 {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        function(candidates,target,0);
        return result;
    }

private:
    vector<vector<int>>result;
    vector<int>current;

    void function(vector<int>& candidates,int target,int index)
    {
        if(target==0){
            result.push_back(current);
            return;
        }
        
        if(index==candidates.size() || target<0)return;
        
        current.push_back(candidates[index]);
        function(candidates,target-candidates[index],index);
        current.pop_back();
        function(candidates,target,index+1);      
    }
};

'PS > LeetCode' 카테고리의 다른 글

[LeetCode] 078 Subsets  (0) 2021.11.11
[LeetCode] 062. Unique Paths  (0) 2021.11.11
[Leet Code] 046 Permutations  (0) 2021.11.06
[Leet Code] 066 Plus One  (0) 2021.11.05
[Leet Code] 034. Find First and Last Position of Element in Sorted Array  (0) 2021.10.08
Comments