관리 메뉴

개발 여행자, 현

[JavaScript] 프로그래머스 타겟넘버 (DFS, 재귀함수) 본문

알고리즘

[JavaScript] 프로그래머스 타겟넘버 (DFS, 재귀함수)

예스현 2022. 11. 14. 08:24

[JavaScript] 프로그래머스 타겟넘버 



문제

https://school.programmers.co.kr/learn/courses/30/lessons/43165#

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

 

문제풀이

처음엔 여러겹의 for문을 돌려 모든 경우의 수를 판단하려 했지만, 너무 복잡해지는 것 같아서 재귀 함수를 이용하여 DFS를 구현했다.

DFS/BFS 관련 정리글은 밑 링크에서 확인할 수 있다.

https://yeshyun.tistory.com/28 

 

[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란?

너비우선탐색(BFS) 깊이우선탐색(DFS) DFS(깊이우선탐색)이란? - 정점의 자식인 노드들을 먼저 탐색하는 방식 - 큐와 스택 1개씩 이용 const graph = { A: ["B", "C"], B: ["A", "D"], C: ["A", "G", "H", "I"], D: ["B", "E"

yeshyun.tistory.com

(아이패드가 현재 없어서 이면지에 끄적인 DFS 그래프..)

이 문제의 각 노드(숫자)는 다음 인덱스의 숫자가 (+)인 경우와 (-)인 경우 두 가지의 자식 노드를 가진다.

DFS 방법에 따라 모든 숫자가 (+)인 경우를 모두 탐색한 뒤, 다음 인덱스의 숫자가 (-)인 경우를 거꾸로 탐색한다.

코드는 다음과 같다.

function solution(numbers, target) {
    let answer = 0;
    
    function dfs_recursive(index, sum){
        if (index === numbers.length){
            if(sum === target) {
                answer++;
                }
            return;
        }
        dfs_recursive(index + 1, sum + numbers[index]);
        dfs_recursive(index + 1, sum - numbers[index]);
    }
    
    dfs_recursive(0,0)
    return answer;
}

(+)의 자식 노드 탐색 → (-)의 자식 노드 탐색 순서로 과정이 진행되며
index 1이 (-)일 때의 자식 노드의 경우의 수 (+), (-) 를 모두 탐색하면 해당 함수가 종료된다.

재귀함수의 개념이 와닿지 않아서, 다른 분들의 코드를 참고하며 하나씩 이해해나갔다.

배열로 과정을 살펴보면

[+1, +1, +1, +1, +1]
[+1, +1, +1, +1, -1]
[+1, +1, +1, -1, +1]
[+1, +1, +1, -1, -1]
[+1, +1, -1, +1, +1]
.
.
.

추상적으로만 생각했을 때 확 와닿지 않았는데

배열로 하나씩 이해하니 어떻게 재귀함수가 진행되는지 이해할 수 있었다.

 

💡 느낀점

- 그래프 표현, 재귀함수, DFS/BFS 개념이 정립되지 않은 상태여서 문제를 보고 어떠한 방법으로 풀어야할지 감이 안잡혔다.

- 이번 문제풀이를 통해서 개념을 하나씩 정립했고,  계속해서 반복하다보면 언젠간 익숙해질 것이라고 믿는다.

- 알고리즘 이전에 자료구조의 개념을 확실히 다시 정립해야됨을 다시 한 번 느꼈다.