[Programmers] 타겟넘버 (JS)

nRecode·2020년 9월 9일
0

Algorithm

목록 보기
7/48

문제

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 이하인 자연수입니다.

입출력 예

numberstargetreturn
[1,1,1,1,1,]35

접근

전에 한 번 풀어본 문제로 트리로 접근하면 되는 문제이다.
우선 numbers의 요소들을 모두 더하거나 빼야하므로 아래와 같은 경우를 생각한다.

     0
   +/ \-
   1   1
 +/ \-
 1   1

트리의 left는 + 트리의 right는 -로 생각하고 모든 트리를 탐색하여 그 깊이가 numbers.length만큼 됐을 때, target의 수와 일치하면 카운트를 한다.

  1. 재귀를 만든다. 인자에는 재귀가 얼마나 실행되는지 수를 셀 cnt와 재귀를 돌며 계속 합을 할 sum 두가지가 들어간다.
  2. cnt가 numbers.length와 같다면 재귀를 멈추는데, 이때 target과 sum이 일치하면 answer 값을 +1 한다.
  3. 트리의 왼쪽과 오른쪽 모두 돌린다.

풀이

function solution(numbers, target) {
    var answer = 0; // 타겟의 수와 일치하게 되면 카운트

    // 재귀를 사용한다. numbers.length만큼 돌았을때 탈출
    let cntNum = function(cnt, sum){
        if(cnt === numbers.length){
            if(sum === target){
                answer ++;
            }
            return ;
        }
        cntNum(cnt + 1, sum + numbers[cnt]); // 트리의 왼쪽을 돌 경우
        cntNum(cnt + 1, sum - numbers[cnt]); // 트리의 오른쪽으로 돌 경우 
        
    }
    
    cntNum(0,0);
     
    return answer;
}

😀

profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글