프로그래머스 - 타겟넘버(Lv2)

108번뇌·2020년 10월 24일

#include <string>
#include <vector>

using namespace std;
 int answer = 0;

int RecurFunc(vector<int> Container, int target, int sum ,int CountForStop)
{
    if(CountForStop == Container.size())
    {
        if(sum == target)
        {
            answer++;
        }
        return 1;
    }
    RecurFunc(Container, target, sum + Container[CountForStop], CountForStop+1);
    RecurFunc(Container, target, sum - Container[CountForStop] ,CountForStop+1);
}

int solution(vector<int> numbers, int target) {
 
    int Count = 0;
    
    RecurFunc(numbers, target, 0, Count);
    return answer;
}

이렇게 하면 일단 프로그래머스에서 core dump 라고 계속 나온다. 원인을 몰라서 디버깅 해봤는데 비줠 스튜디오에서는 warining이 나오지만 된다.

void RecurFunc(vector<int> Container, int target, int sum ,int CountForStop)
{
    if(CountForStop == Container.size())
    {
        if(sum == target)
        {
            answer++;
        }
        return;
    }
    RecurFunc(Container, target, sum + Container[CountForStop], CountForStop+1);
    RecurFunc(Container, target, sum - Container[CountForStop] ,CountForStop+1);
}

void형식으로 좀 더 안전하게 가자.
CountForStop은 1씩 커지고 이게 총 컨테이너 사이즈만큼 되면 종료된다.
그리고 결과물은 2^(CountForStop) <ㅡ 이진트리 구조인거 생각하기

그리고 이 문제 푸는데 못풀었는데 이해하는데 엄청 오래걸렸다.

DFS를 코딩으로 처음 접해봤는데 이해하는데 오래걸렸다.
DFS를 코딩으로 작성할 때, 내가 이해한 구조는

1. 본함수 내에서 - 재귀함수 2번 호출 (양옆으로 가지치기 위해서)
2. 양옆으로 가지치기를 언제까지 할것인가에 대한 조건.
이 문제에서는 함수 내의 4번째 CountForStop이 Container.size와 같은경우로 걸어놨다.(결과물 총 8개 나오게됬음)
3. 그리고 8개의 총결과물중 과연 찾고자 하는것이 무엇인지. (사진에서는 target 1임) **

무언가 결과물을 만들고, 찾을때 2^n구조로 결과물이 생겨나는 것에 대한 접근 방식으로 알아두면 좋을것같다.

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글