해당 게시글은 [Java] 어서와! 자료구조 알고리즘은 처음이지?https://programmers.co.kr/learn/courses/13577를 간략히 요약한 게시글이며 모든 출처는 해당강의에 있습니다
더하는 경우와 빼는 경우를 모두 구하여 target
에 해당하는 경우가 몇개인지 구하는 경우입니다. 모든 수를 더하고 빼면서 경우의 수를 일일이 더해야 합니다.
class Solution {
int answer = 0;
public int solution(int[] numbers, int target) {
//재귀
//-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(numbers, target, 0, 0);
return answer;
}
//재귀
public void dfs(int[] numbers, int target, int index, int sum){
//종료 조건
if(index == numbers.length){
if(sum == target) answer++; //목표 수
return;
}
//재귀 식
//더했을 때
dfs(numbers,target,index+1,sum+numbers[index]);
//뺏을 떄
dfs(numbers,target,index+1,sum-numbers[index]);
}
}
answer
를 필드로 두고 재귀 함수내에서 3구역으로 나누어 구현하였습니다.
종료 조건
+ 더하는 경우
+ 빼는 경우
로
종료 조건
은 문제에서 지시한대로 numbers
의 모든 수를 연산하였을 때(=인덱스를 넘어갔을 때) 결과를 판단합니다.
target
과 동일한 결과면 answer
를 +1하여 갯수를 추가합니다.
더하는 경우와 빼는 경우 둘로 나누어 각각 재귀적으로 함수를 호출합니다.
class Solution {
public int solution(int[] numbers, int target) {
return sumCount(numbers,target,0,0); //재귀 시작
}
//재귀 함수
int sumCount(final int[] numbers, final int target, int index, int sum){
//종료 조건
if(index == numbers.length){
if(sum == target) return 1; //target이면 + 1추가
return 0; //아니면 추가 안함
}
//더하는 경우
//빼는 경우
//target인 숫자의 갯수를 더함
return sumCount(numbers, target, index + 1, sum + numbers[index]) +
sumCount(numbers, target, index + 1, sum - numbers[index]);
}
}
제가 풀었던 방법과 비슷 합니다.
종료 조건
+ 더하는 경우
+ 빼는 경우
로 나누지만
answer
이라는 필드에 결과를 저장하였던 방법과는 다르게, 재귀 함수내에서 결과들을 합하여 최종 반환시 결과를 가지게 됩니다.
더하는 재귀호출은 또 내부적으로 더하는 재귀호출과 빼는 재귀호출에서 target
과 일치하는 경우의 갯수를 가지고 빼는 재귀호출도 내부적으로 더하는 재귀호출과 빼는 재귀호출에서 target
과 일치하는 경우의 갯수를 가지고 와서 둘을 더하게 되면
재일 처음 호출된 재귀함수는 target
과 일치하는 모든 경우의 수를 반환하게 됩니다.