• [Day02] [프로그래머스][LV2] 타겟넘버

    2023. 12. 13.

    by. V_Jun

    ✅ 문제 설명

     

    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개 이상 20개 이하입니다.
    각 숫자는 1 이상 50 이하인 자연수입니다.
    타겟 넘버는 1 이상 1000 이하인 자연수입니다.

     

    ✅ 입출력 예

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

     

    입출력 예 #1

    ✅ 입출력 예 #1

    문제 예시와 같습니다.

    ✅ 입출력 예 #2

    +4+1-2+1 = 4
    +4-1+2-1 = 4

     

    * 총 2가지 방법이 있으므로, 2를 return 합니다.

     

    ⚠️ 문제 접근 Point

    1. 어떤 경우의 수가 나올 수 있는지 그려보면 이해가 빠르다.

     

    입출력의 예로 나온 문제를 그림으로 그려, 보다 이해가 쉽도록 정리해보았다.

     

    이때, 왼쪽 노드의 경우 + / 오른쪽 노드의 경우 - 의 원칙을 가질 수  있도록 구성하였다.

    why? + / - 두 가지 경우밖에 존재하지 않기 때문이다. / "순서를 바꾸지 않고 적절히 더하거나 빼서" 라는 문제의 의도 파악

     

    ✅ 구현코드

    class Solution {
        int[] numbers;
        int target;
        int answer;
        
        public int solution(int[] numbers, int target) {
            answer = 0;
            this.numbers = numbers;
            this.target = target;
            
            dfs(0,0);
            
            return answer;
        }
        
    
        void dfs (int index, int sum){
            if(index == numbers.length){
                if(sum == target) answer++;
                return;
            }
            dfs(index + 1, sum + numbers[index]);
            dfs(index + 1, sum - numbers[index]);
        }
    }

    ✅ 같이 생각해보면 좋을 부분

    1. dfs의 작동 원리

    2. 해당 코드의 디버깅 과정

     

     

    댓글