반응형
문제 설명에 쓰인 예제를 예로 들어 풀이 하겠다.
□1□1□1□1□1 = 3에서
□에 +/- 를 넣어 3을 만들 수 있는 경우의 수를 계산하면 되는 문제이다.
이를 해결하기 위해서, 뒤에 있는 □일 수록 깊이가 커지는 DFS를 수행하면 된다.
예를 들면 탐색 순서는
+++++
++++-
+++-+
+++--
++-++
......
이런 식인 것이다.
DFS의 깊이가 numbers의 크기와 같아지면 리턴을 하되, 누적 값이 target과 같다면 리턴하기 전에 answer에 1을 더하고 target과 같지 않다면 그냥 리턴만 해버리면 된다.
테스트 케이스 8개 모두 통과
#include <vector>
using namespace std;
int answer;
void dfs(int sum, int depth, vector<int> numbers, int target){
if(depth==numbers.size()){
if(sum==target) answer++;
return;
}
dfs(sum+numbers[depth],depth+1,numbers,target);
dfs(sum-numbers[depth],depth+1,numbers,target);
}
int solution(vector<int> numbers, int target) {
dfs(0,0,numbers,target);
return answer;
}
반응형
'Algorithm > DFS' 카테고리의 다른 글
[DFS, 난이도 중] 프로그래머즈, 쿼드압축 후 개수 세기 (0) | 2020.10.19 |
---|---|
DFS/BFS 고득점 kit 풀이 완료, 후기 (0) | 2020.09.30 |
[DFS, 난이도 중] 프로그래머즈, 단어 변환 (0) | 2020.09.29 |
[DFS, 난이도 중상] 프로그래머즈, 여행경로 (0) | 2020.09.24 |
[DFS, 난이도 중상] 백준 1937번 욕심쟁이 판다 (0) | 2020.08.17 |
댓글