Fall in IT.

프로그래머스 코딩테스트 [깊이/너비우선탐색 (DFS, BFS)] - Javascript 본문

Algorithm

프로그래머스 코딩테스트 [깊이/너비우선탐색 (DFS, BFS)] - Javascript

D.Y 2019. 10. 24. 13:15

문제 설명

n개의 음이 아닌 정수가 있습니다 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다예를 들어 [11111] 숫자 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

[111113   5

 

입출력  설명

문제에 나온 예와 같습니다.

 

 

 

function solution(numbers, target) {
    let answer = 0;
    dfs(0);

    /**
     * numbers 배열의 인덱스를 순차적으로 돌면서 +1, -1을 반복한다.
     * 트리구조를 생각했을때, 왼쪽은 +1, 오른쪽은 -1 연산을 한다고 생각하면 된다.
     * DFS, BFS의 개념은 아래 링크를 참조하자.
     * https://www.youtube.com/watch?v=_hxFgg7TLZQ
     */
    function dfs(k) {
        if (k === numbers.length) {
            let sum = 0;
            for (let i = 0; i < numbers.length; i++)
                sum += numbers[i];
    
            if (sum === target)
                answer++;
    
            return;
        }
        else {
            numbers[k] *= 1;
            dfs(k + 1);
    
            numbers[k] *= -1;
            dfs(k + 1);
        }
    }        

    return answer;
}

console.log(`solution: ${solution([1, 1, 1, 1, 1], 3)}`); // 5

참조

https://www.youtube.com/watch?v=_hxFgg7TLZQ

https://programmers.co.kr/learn/challenges?selected_part_id=12421

 

Comments