반응형

문제 출처

https://programmers.co.kr/learn/courses/30/lessons/43165


처음에 어떻게 풀어야 하는지 고민하던 문제다. 전체 numbers를 root로 두고 depth를 1씩 늘려가는 트리형식으로 내려가는 형식으로 풀이했다. 

[1, 1, 1, 1, 1]이 있다면 

첫번째 depth는 1과 -1이 될 것이고 두번째는 1에서 파생된 1+1, 1-1 // -1에서 파생된 -1+1, -1-1 두가지가 될 것이다. 이로 쭉쭉 내려가서 numbers.size()가 5이므로 depth는 5까지 뻗어나갈 수 있는데 이때 target과 현재 depth에서의 합계가 같으면 전역변수 ret을 +1해 준후 return해준다.


소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <vector>
 
using namespace std;
int ret;
 
void dfs(vector<int> &numbers, int target, int sum, int depth) {
    if(depth >= numbers.size()) {
        if(sum==target)
            ret++;
        return;
    }
    dfs(numbers, target, sum+numbers[depth], depth+1);
    dfs(numbers, target, sum-numbers[depth], depth+1);
}
 
int solution(vector<int> numbers, int target) {
    dfs(numbers, target, numbers[0] , 1);
    dfs(numbers, target, numbers[0]*-1, 1);
 
    return ret;
}
cs




반응형

'Algorithm' 카테고리의 다른 글

[BOJ 6603] 로또  (0) 2018.12.31
[BOJ 2667] 단지번호붙이기  (0) 2018.12.31
[BOJ 2644] 촌수계산  (0) 2018.12.31
[BOJ 2606] 바이러스  (0) 2018.12.28
[BOJ 2583] 영역구하기  (0) 2018.12.28

+ Recent posts