[프로그래머스] (JavaScript) 타겟 넘버 - DFS
문제 설명
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 이하인 자연수
입출력 예
numbers | target | return |
[1, 1, 1, 1, 1] | 3 | 5 |
[4, 1, 2, 1] | 4 | 2 |
입출력 예 설명
[입출력 예 #1]
문제 예시와 같음
[입출력 예 #2]
+ 4 + 1 - 2 + 1 = 4
+ 4 - 1 + 2 - 1 = 4
총 2가지 방법이 있으므로 2를 return 함
정답 코드
function solution(numbers, target) {
let answer = 0;
const dfs = (idx, curN) => {
if (idx == numbers.length) {
curN == target && answer++;
return;
}
dfs(idx + 1, curN + numbers[idx]);
dfs(idx + 1, curN - numbers[idx]);
}
dfs(0, 0)
return answer;
}
코드 풀이
const dfs = (idx, curN) => {
// if (idx == numbers.length) {
// curN == target && answer++;
// return;
// }
dfs(idx + 1, curN + numbers[idx]);
dfs(idx + 1, curN - numbers[idx]);
}
dfs(0, 0)
dfs 함수는 현재 값 numbers[idx] 를 찾아 줄 idx 와 현재 값 numbers[idx] 를 계산한 현재 누적값인 curN 매개변수로 받는다.
하나의 dfs 함수에는 idx + 1로 다음 인덱스 값과, curN 에 현재 값 numbers[idx] 를 더하여 호출한다.
또 다른 dfs 함수에는 idx + 1로 다음 인덱스 값과, curN 에 현재 값 numbers[idx] 를 빼서 호출한다.
이렇게 되면 numbers 의 모든 값들이 더해진 경우, 빼진 경우로 나뉘어 dfs 가 각각 호출된다.
if (idx == numbers.length) {
curN == target && answer++;
return;
}
마지막 idx 값까지 돌다가 idx == numbers.length 가 되면 return 한다.
이때, curN 값이 target 와 같다면 answer 의 값을 증가시키고, 다르다면 아무것도 수행하지 않는다.
풀이 상세
모든 방법을 탐색한 뒤 최종 방법의 개수를 구하는 것이므로 DFS 방식으로 풀었다.
입출력 예시로 설명해보겠다.
numbers : [4, 1, 2, 1]
target : 4
첫 번째가 + 4 인 경우만 보면,
DFS(0, 0)
i DFS(1, + 4)
ii DFS(2, + 4 + 1)
iii DFS(3, + 4 + 1 + 2)
iv DFS(4, + 4 + 1 + 2 + 1) → idx 4 return, curN == target [조건 X]
iv DFS(4, + 4 + 1 + 2 - 1) → idx 4 return, curN == target [조건 X]
iii DFS(3, + 4 + 1 - 2)
v DFS(4, + 4 + 1 - 2 + 1) → idx 4 return, curN == target [조건 O] → answer++
v DFS(4, + 4 + 1 - 2 - 1) → idx 4 return, curN == target [조건 X]
ii DFS(2, + 4 - 1)
vi DFS(3, + 4 - 1 + 2)
vii DFS(4, + 4 - 1 + 2 + 1) → idx 4 return, curN == target [조건 X]
vii DFS(4, + 4 - 1 + 2 - 1) → idx 4 return, curN == target [조건 X]
vi DFS(3, + 4 - 1 - 2)
viii DFS(4, + 4 - 1 - 2 + 1) → idx 4 return, curN == target [조건 O] → answer++
viii DFS(4, + 4 - 1 - 2 - 1) → idx 4 return, curN == target [조건 X]
i DFS(1, - 4)...
+ 4인 경우까지만 보면 총 2가지인 것을 알 수 있다.
'💠문제 풀이 > 코딩 테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스] (Java) 배달 - 다익스트라 알고리즘 (0) | 2025.01.13 |
---|---|
[프로그래머스] (JavaScript) 단어 변환 - BFS (0) | 2024.06.07 |
[프로그래머스] (JavaScript) 네트워크 - DFS (0) | 2024.06.05 |
[프로그래머스] (JavaScript) 피로도 - DFS (1) | 2024.06.01 |