https://programmers.co.kr/learn/courses/30/lessons/43165
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+
programmers.co.kr
문제에 대해 감이 잘 잡히지 않아서 구글 검색으로 솔루션을 찾아 각각 DFS와 BFS로 구현했다.
DFS는 재귀로, 인덱스 1부터 numbers.size()까지 노드를 다 탐색했을 경우, sum값과 target값을 비교해 같을때 answer값을 1씩 증가시켰다.
DFS
DFS 코드 c++
void dfs(vector<int> numbers, int target, int sum, int i){
if( i == numbers.size()){
if(sum == target) answer++;
return;
}
dfs(numbers, target, (sum - numbers[i] ), i+1);
dfs(numbers, target, (sum + numbers[i] ), i+1);
}
int solution(vector<int> numbers, int target) {
dfs(numbers, target, 0, 0);
return answer;
}
BFS는 큐로 구현했고, 상위 큐 사이즈를 기준으로 push, pop을 반복하며 마지막 리프노드만 남았을 때, target과 값이 같은 리프노드의 개수만큼 answer++ 해줬다.
BFS
BFS 코드 c++
int answer = 0;
void bfs(vector<int> numbers, int target){
queue<int> q;
q.push(-numbers[0]);
q.push(numbers[0]);
for(int i=1;i<numbers.size();i++){
int node_count = q.size();
for(int j=0;j<node_count;j++){
int parent = q.front();
q.pop();
q.push(parent - numbers[i]);
q.push(parent + numbers[i]);
}
}
while (!q.empty()) {
if(q.front() == target) answer++;
q.pop();
}
}
int solution(vector<int> numbers, int target) {
bfs(numbers, target);
return answer;
}
'코딩테스트 연습 > programmers' 카테고리의 다른 글
[Programmers] 깊이/너비 우선 탐색(DFS/BFS) > 여행경로(c++) (0) | 2022.01.17 |
---|---|
[Programmers] 깊이/너비 우선 탐색(DFS/BFS) > 단어 변환(c++) (0) | 2022.01.13 |
[Programmers] 깊이/너비 우선 탐색(DFS/BFS) > 네트워크(c++) (0) | 2022.01.12 |
[Programmers] 정렬 > H-index (0) | 2022.01.11 |
[Programmers] 정렬 > 가장 큰 수 (0) | 2022.01.11 |