[프로그래머스]타겟 넘버(깊이/너비 우선탐색/JS)
예전에 깊이/너비 우선탐색을 공부했던 적이 있는데 어느정도 시간이 지난 후에 다시 하려니 머리가 새하얗다.
다시 감을 잡아봐야겠다 싶어서 문제 풀이를 해봤다.
DFS/BFS
DFS(Depth first search)는 깊이 우선 탐색으로 세로방향으로 자식노드를 먼저 탐색 후 다시 상위노드로 올라가서
BFS(Breadth first search)는 너비 우선 탐색으로 가로방향으로 형제 노드 먼저 탐색 후 자식노드로 내려간다.
전에 BFS/DFS를 정리했던 글을 참고했다.
알고리즘_깊이우선탐색(DFS),너비우선탐색(BFS) / JS
타겟 넘버
문제 설명
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 이하인 자연수입니다.
제공된 배열안 숫자들을 양수와 음수로 모두 사용해서 target과 동일한 숫자를 만들어 낼 수 있는 경우의 수를 구하면 되는 문제이다.
이 문제는 재귀함수 방식으로 풀이했다.
처음에 재귀를 쓰지 않고 문제를 풀어보려고 했다가 막혀 한참을 고생하곤... 다른 분이 풀이한 것을 참고했다.
function solution(numbers, target) {
let answer = 0;
function DFS(i, sum) {
if (i === numbers.length) {
if (sum === target) {
answer++;
}
} else {
DFS(i + 1, sum + numbers[i]);
DFS(i + 1, sum - numbers[i]);
}
}
DFS(0, 0);
return answer;
}
처음 (0,0)을 인덱스와 sum에 넣어주고, 재귀함수가 시작된다.
먼저 + 재귀함수 식에서 인덱스가 5가 될때까지 계산한다.
계산이 마무리 됐으면 다시 부모 노드로 올라가 - 재귀함수 식으로 내려온다.
이 방식으로 반복되면서 답이 target과 같아지면 answer에 1을 더해준다.
위 DFS 그림을 참고하면 이해가 조금 더 잘 된다.
성공 !