#include <vector>
using namespace std;
int answer=0;
void dfs(vector<int>& numbers, int& target, int idx, int num){
if(idx+1 == numbers.size()+1){
if(num == target) answer++;
return;
}
dfs(numbers, target, idx+1, num+(-1)*numbers[idx]);
dfs(numbers, target, idx+1, num+numbers[idx]);
}
void bfs(vector<int>& numbers, int& target){
queue<pair<int, int>> que;
que.push({numbers[0], 1});
que.push({(-1)*numbers[0], 1});
while(!que.empty()){
auto [num, idx] = que.front(); que.pop();
if(idx == numbers.size()){
if(num == target) answer++;
continue;
}
que.push({num + numbers[idx], idx+1});
que.push({num + (-1)*numbers[idx], idx+1});
}
}
int solution(vector<int> numbers, int target) {
dfs(numbers, target, 0, 0);
// bfs(numbers, target);
return answer;
}
문제
https://programmers.co.kr/learn/courses/30/lessons/43165
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수
programmers.co.kr
DFS
https://jolly-note.tistory.com/62?category=993245
DFS (Depth First Search, 깊이 우선 탐색)
접근 graph 또는 tree를 탐색하는 알고리즘이다. 특정 노드부터 시작하여 최대한 멀리 갈 수 있을만큼 진행한다. 바로 전 분기점까지 돌아가고 아직 방문하지 않은 다음 노드로 진행한다. (방문한
jolly-note.tistory.com
[접근1]
dfs 함수에 숫자가 담긴 벡터와, target number를 건내주고, numbers의 어느 숫자를 가르킬 지 나타내는 idx와 계산 숫자 num을 0으로 초기화하여 넣어준다.
dfs(numbers, target, 0, 0);
[접근2]
만약 numbers의 끝까지 돌았다면 함수를 더이상 dfs를 더 부르지 않고 끝내주는데,
만약 계산한 숫자가 target이랑 같으면 답을 1 증가시켜준다.
if(idx+1 == numbers.size()+1){
if(num == target) answer++;
return;
}
[접근3]
끝까지 돌지 않았다면, num에 다음 숫자를 더하거나 빼서 다음 dfs로 건내준다.
dfs(numbers, target, idx+1, num+(-1)*numbers[idx]);
dfs(numbers, target, idx+1, num+numbers[idx]);
BFS
https://jolly-note.tistory.com/63?category=993245
BFS (Breadth First Search, 너비 우선 탐색)
접근 graph 또는 tree를 탐색하는 알고리즘이다. 특정 노드부터 시작하여 인접한 노드들을 먼저 탐색한다. (최단 경로를 찾을 때 사용) 특정 노드로부터의 거리에 따라 순서대로 탐색한다. 알고리
jolly-note.tistory.com
[접근1]
queue에 처음숫자를 -1 곱한것과 곱하지 않은것 두가지를 넣고, idx는 다음 숫자를 가리키는것으로 넣어준다.
que.push({ numbers[0], 1 });
que.push({ (-1)*numbers[0], 1 });
[접근2]
queue가 빌때까지 반복하는데,
que의 맨 앞을 꺼내서 num과 idx에 넣는다.
만약 idx가 끝까지 돌았다면 while 조건문으로 돌아가는데 num이 target이랑 같으면 answer을 1 증가시켜준다.
끝까지 돌지 않았다면, que에 현재 num에 다음 숫자를 더하거나 빼고 다음 idx를 가리키는 pair를 넣어준다.
while (!que.empty()) {
auto[num, idx] = que.front(); que.pop();
if (idx == numbers.size()) {
if (num == target) answer++;
continue;
}
que.push({ num + numbers[idx], idx + 1 });
que.push({ num + (-1)*numbers[idx], idx + 1 });
}'coding > algorithm' 카테고리의 다른 글
| [백준/baekjoon] Silver1 2667. 단지번호붙이기 (0) | 2022.05.27 |
|---|---|
| [programmers] Lv.3 네트워크(c++) (0) | 2022.05.25 |
| [SW Expert Academy] D2 1926. 간단한 369게임 (0) | 2022.05.24 |
| [SW Expert Academy] D2 1954. 달팽이 숫자 (0) | 2022.05.24 |
| [SW Expert Academy] D3 1208. Flatten (0) | 2022.05.23 |
댓글