class Solution {
int answer = 0;
public int solution(int[] numbers, int target) {
dfs(numbers, target, 0, 0);
return answer;
}
public void dfs(int[] numbers, int target, int depth, int sum) {
if(depth==numbers.length) {
answer += sum==target ? 1 : 0;
} else {
dfs(numbers, target, depth+1, sum+numbers[depth]);
dfs(numbers, target, depth+1, sum-numbers[depth]);
}
}
}
dfs문제이다.
풀이를 그림으로 확인해보면 쉽게 이해 할 수 있다.
검은색이 +, 하얀색이 - 라고 한다면
다음 숫자 나타내기 위해 depth
라는 index를 사용한 것이며, 반복적인 선택을 위해 재귀 호출을 사용했다.
모든 탐색이 끝나면(depth==numbers.length
), sum이 target과 일치하는지 확인한다.
class Solution {
public int solution(int[] numbers, int target) {
int answer = 0;
answer = dfs(numbers, 0, 0, target);
return answer;
}
int dfs(int[] numbers, int n, int sum, int target) {
if(n == numbers.length) {
if(sum == target) {
return 1;
}
return 0;
}
return dfs(numbers, n + 1, sum + numbers[n], target) + dfs(numbers, n + 1, sum - numbers[n], target);
}
}
이분도 재귀호출을 사용했는데, return 부분에 사용한 것이 인상적인다.