티스토리 뷰

728x90
반응형

 

 

타겟 넘버

 

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

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

 

내 풀이 

  • DFS - JavaScript
function solution(numbers, target) {
    let answer = 0;
    let sum = 0; 
    let cnt = 0; // target을 만드는데 성공한 가지 수 저장 변수
    
    // DFS 시작
    function DFS(L, sum){
        if (L === numbers.length) { // 만약 Level이 0 ~ numbers.length - 1 이후일 때.
            if (sum === target){ // sum과 target이 같다면 가지 수 +1
                cnt++;
            }
        }else {
            // 이진트리 부모에서 numbers[L]을 더해주는 왼쪽 자식 생성
            // index엔 L을 넣어준다. for문 써야되는 순열이나 조합이랑 구별 잘하기.
            DFS(L+1, sum + numbers[L]);
            
            // 루트 노드에서 number[L] 만큼의 값을 빼서 오른쪽 자식 노드 생성
            DFS(L+1, sum - numbers[L]);    
            
            // 이후에 이진 트리에서 if문에 설정한 L까지 모든 조건을 탐색한다.
        }
    }
    
    // Level은 0부터 시작, 타겟넘버와 비교를 위한 sum을 0으로 입력
    DFS(0, 0);
    answer = cnt;
    return answer;
}

 

  • DFS - JAVA 
class Solution {
    int answer = 0;

    public int solution(int[] numbers, int target) {
        DFS(0,0,numbers,target);
        return answer;
    }

    private void DFS(int L, int sum, int[] numbers, int target)
    {
        if (L == numbers.length)
        {
            if (sum == target)
            {
                answer++;
                return ;
            }
        }
        else
        {
            int temp;
            temp = sum + numbers[L];
            DFS(L + 1, temp, numbers, target);
            temp = sum - numbers[L];
            DFS(L + 1, temp, numbers, target);
        }

    }
}
728x90
반응형
댓글