이 문제의 핵심은 DFS/BFS 유형의 문제라는 것을 알아차리는 것이다.
numbers
의 숫자들은 각각 더하거나 빼는 2가지 선택이 가능하다. 이를 해당 숫자를 더한 노드와 뺀 노드를 탐색한다고 이해할 수 있다.numbers
의 합, 차로 만들 수 있는 모든 숫자를 그래프로 만들어서, 이 중 조건에 맞는 값을 탐색하는 문제로 바꿔 생각할 수 있다.DFS로 구현하는 방법은 다음과 같다.
→ 함수를 재귀적으로 호출하며, numbers
의 숫자를 방문하고 누적 값을 계산하는 과정을 반복한다.
numbers
의 인덱스와 앞서 계산된 누적 값이 포함되어야 한다.numbers
의 마지막 인덱스 일 때 누적 값이 target
값과 같다면, target
을 만드는 1가지 경우의 수를 찾은 것이므로 1을 반환한다. 아니라면 0을 반환한다.BFS로 구현하는 방법은 다음과 같다.
→ 큐(Queue)가 빌 때까지 numbers 의 숫자를 방문하고 누적 값을 계산하는 과정을 반복한다.
numbers
의 인덱스와 앞서 계산된 누적 값이 함께 들어가야 한다.numbers
의 마지막 인덱스 일 때 누적 값이 target
값과 같다면, target
을 만드는 1가지 경우의 수를 찾은 것이므로 1을 반환한다. 아니라면 0을 반환한다.class Solution {
public int dfs(int[] numbers, int target, int index, int value){
if(index == numbers.length-1){
if(target == value){
return 1;
}else{
return 0;
}
}
int result = 0;
index += 1;
result += dfs(numbers, target, index, value - numbers[index]);
result += dfs(numbers, target, index, value + numbers[index]);
return result;
}
public int solution(int[] numbers, int target) {
return dfs(numbers, target, -1, 0);
}
}
import java.util.*;
class Item{
int index;
int value;
Item(int index, int value){
this.index = index;
this.value = value;
}
}
class Solution {
public int bfs(int[] numbers, int target){
int result = 0;
Queue<Item> queue = new LinkedList<Item>();
queue.add(new Item(-1, 0));
while(!queue.isEmpty()){
Item item = queue.poll();
if(item.index == numbers.length-1){
if(item.value == target){
result += 1;
}
continue;
}
int index = item.index+1;
queue.add(new Item(index, item.value-numbers[index]));
queue.add(new Item(index, item.value+numbers[index]));
}
return result;
}
public int solution(int[] numbers, int target) {
return bfs(numbers, target);
}
}
def dfs(numbers, target, index, value):
if len(numbers)-1 == index:
if target == value:
return 1
else:
return 0
index += 1
minus_value = dfs(numbers, target, index, value - numbers[index])
plus_value = dfs(numbers, target, index, value + numbers[index])
return minus_value + plus_value
def solution(numbers, target):
return dfs(numbers, target, -1, 0)
from collections import deque
def bfs(numbers, target):
answer = 0
queue = deque([(-1,0)])
index = 0
while queue:
index, value = queue.popleft()
if index == len(numbers)-1:
if value == target:
answer += 1
continue
index += 1
queue.append((index, value+numbers[index]))
queue.append((index, value-numbers[index]))
return answer
def solution(numbers, target):
return bfs(numbers, target)