#1. 문제
#2. 풀이
1. DFS
- [정의] : DFS(깊이 우선 탐색)은 그래프 내 모든 정점을 탐색하는 방법 중 하나입니다.
- [특징] : DFS는 현재 정점을 기준으로 깊은 탐색을 우선적으로 진행하고, 다음 인접 정점에 대한 깊이 탐색을 진행.
- [구현]
- 재귀 호출
- 스택
2. 두 개의 DFS - 양수에 대한 재귀 DFS, 음수에 대한 재귀 DFS
- numbers 목록의 첫 번째 정점을 시작으로 양수 값에 대한 DFS와 음수 값에 대한 DFS를 호출합니다.
- DFS는 인자 목록 중 'plusOrMinus'를 전달받아, sum 계산에 sum += plusOrMinus * numbers [curIdx] 합니다.
- [조건] : DFS는 sum이 target이 같을 경우, DFS를 종료하고 answer에 +1을 더해줍니다.
- 조건을 만족하지 못했을 경우, 다시, 양수 값에 대한 DFS와 음수 값에 대한 DFS를 재귀적으로 수행합니다.
#3. 코드
#include <string>
#include <vector>
using namespace std;
// /#1. DFS 정의, 다음 Index에 대해 두 개의 DFS를 재귀적으로 수행
void DFS(int &answer, int plusOrMinus, int curIdx, const int &target, int sum, vector<int> &numbers)
{
sum += (plusOrMinus * numbers[curIdx]);
if (curIdx == numbers.size() - 1)
{
if (sum == target)
{
answer++;
}
return;
}
DFS(answer, 1, curIdx + 1, target, sum, numbers);
DFS(answer, -1, curIdx + 1, target, sum, numbers);
}
int solution(vector<int> numbers, int target)
{
int answer = 0;
int sum = 0;
// #1. 양수 버전의 DFS 수행
DFS(answer, 1, 0, target, sum, numbers);
// #2. 음수 버전의 DFS 수행
DFS(answer, -1, 0, target, sum, numbers);
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers_C++]#Level2_N개의 최소 공배수, 유클리드 호제법, 최대 공약수, 최소 공배수 (0) | 2023.12.24 |
---|---|
[Programmers_C++]#Level3_입국 심사, 이분 탐색 (0) | 2023.12.14 |
[Programmers_C++]#Level2_예상 대진표 (0) | 2023.12.13 |
[Programmers_C++]#Level2_구명보트, 투 포인터 알고리즘 (0) | 2023.12.13 |
[Programmers]#Level2_가장 큰 수, sort(), 람다 함수 (1) | 2023.11.23 |