문제
풀이
#include <string>
#include <vector>
using namespace std;
vector<int> datas;
int answer;
int tarN;
void dfs(int n, int before);
int solution(vector<int> numbers, int target) {
answer = 0;
datas = numbers;
tarN = target;
dfs(0, 0);
return answer;
}
void dfs(int n, int before){
if(n == datas.size()){
if(before == tarN) answer++;
return;
}
dfs(n+1, before + datas[n]);
dfs(n+1, before - datas[n]);
return;
}
dfs를 사용하여 모든 경우의 수를 구했다.
다른 사람 풀이 1
#include <string>
#include <vector>
using namespace std;
int total;
void DFS(vector<int> &numbers, int &target,int sum,int n) {
if(n >= numbers.size()){
if(sum == target) total++;
return;
}
DFS(numbers, target, sum + numbers[n], n+1);
DFS(numbers, target, sum - numbers[n], n+1);
}
int solution(vector<int> numbers, int target) {
int answer = 0;
DFS(numbers, target, numbers[0] , 1);
DFS(numbers, target, -numbers[0], 1);
answer = total;
return answer;
}
시작을 더했을 때, 뺐을 때로 정해놓고 각각 dfs를 실행한 듯하다!
내 코드는 전역 변수가 많지만, 이 코드는 참조자를 이용했기 때문에 코드가 더 깔끔하다.
포인터와 레퍼런스는 비슷한 기능을 하고 있는 것처럼 느껴져 자주 헷갈리고 또한 중요하기 때문에 따로 정리를 해 두었다.
밑의 링크를 확인!
https://strong-2-min.tistory.com/93
다른 사람 풀이 2
#include <string>
#include <vector>
using namespace std;
int answer = 0;
int solution(vector<int> numbers, int target) {
if (numbers.size()==0 && target==0) {
return 1;
}
else if (numbers.size() == 0) {
return 0;
}
int temp = numbers[0];
numbers.erase(numbers.begin());
return solution(numbers, target + temp) + solution(numbers, target - temp);
}
재귀 함수를 사용한 풀이이다.
코드는 다 다르지만 모두 비슷한 방법으로 풀었다!
https://copycode.tistory.com/82
https://easycoding91.tistory.com/4
'Algorithm > Programers - C++' 카테고리의 다른 글
[프로그래머스] 행렬 테두리 회전하기 (0) | 2022.04.09 |
---|---|
[프로그래머스] 짝지어 제거하기 / stack(LIFO) (0) | 2022.03.30 |
[프로그래머스] 힙(Heap) - 더 맵게 / 우선순위큐(priority_queue) (0) | 2022.03.23 |
[프로그래머스] 스택/큐 - 기능개발 (0) | 2022.03.19 |
[프로그래머스] 124 나라의 숫자 / insert (0) | 2022.03.16 |