꿀 떨어지는 코딩 양봉장

프로그래머스_Level.2 타겟넘버 본문

알고리즘/프로그래머스

프로그래머스_Level.2 타겟넘버

nayoon030303 2021. 5. 8. 00:30

1.문제설명

문제: 타겟넘버

programmers.co.kr/learn/courses/30/lessons/43165?language=javascript

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+

programmers.co.kr

n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3

+1-1+1+1+1 = 3

+1+1-1+1+1 = 3

+1+1+1-1+1 = 3

+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

2. 제한 사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

3.입출력 예

numbers target return
[1, 1, 1, 1, 1] 3 5

 

📌나의 풀이

처음 문제를 보았을 때는 어떠한 수학적 공식이 있지 않을까라는 생각을 했다. 하지만 아무리 생각해봐도 모든 값을 더하고 뺴고를 해봐야하는 것 같았다. 테스트 케이스가 모두 1,1,1,1,1이라서 순서를 생각해야하나 아니면 순서의 상관이 없이 target을 구하는 것인가 햇갈렸다 결론은 순서대로 더하기 뺴기를 수행해야한다. 

어떤 방법으로 접근해야할지 몰라서 인터넷 검색을 했다. 

 

function solution(numbers, target) {
    var answer = 0;
    function recur(cnt, sum){
        if(cnt===numbers.length){
            if(sum===target){
                answer++;
            }
            return;
        }

        //+,-연산 모두 수행
        recur(cnt+1, sum+numbers[cnt]);
        recur(cnt+1, sum-numbers[cnt]);
    }
    recur(0,0);
    return answer;

    
}

DFS를 사용하여 cnt=0부터 cnt가 numbers의 길이만큼 실행되면서

recur(cnt+1, sum+numbers[cnt]); 더하기 recur(cnt+1, sum-numbers[cnt]); 빼기 를 수행한다. 

 

💡배운점

  • 모든 값을 모두 더하거나 빼거나 DFS를 사용한다.

참고 자료

velog.io/@noyo0123/%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84-javascript-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4