[프로그래머스] [C++] 타겟 넘버 (dp, dfs)
2021. 3. 9. 17:18ㆍ알고리즘/프로그래머스
1. 문제
사용할 수 있는 숫자들과 타겟 넘버가 주어진다.
사용할 수 있는 숫자들 모두 사용하여 타겟넘버를 만들어라
단, 이때 연산은 +, - 만 가능하다.
2. 핵심
이 문제의 핵심은 사용할 수 있는 숫자들 모두를 사용하는 것이다.
처음에는 순서도 포함하여 세는줄 알았지만 순서는 필요없다는 것
그냥 숫자를 사용하기만 하면된다는 것이다.
모든 숫자를 사용해야하므로 재귀를 통해 모든 숫자를 탐색하면서
+ 이나 - 를 해주며 마지막 숫자일때 타겟넘버와 동일한지 검사한다.
이는 dfs형태로 이루어지며
혹시모를 겹치는 부분을 대비하여 dp 를 적용시킬 수 있다.
(실제로 테스트 1 과 테스트 2의 경우 시간이 빨라진다.)
3. 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include <string>
#include <vector>
#include <cstring>
using namespace std;
int cache[2001][20];
int dfs(int here, const vector<int>& numbers, const int& target, int sum)
{
int& ret = cache[1000 + sum][here];
if(ret != -1) return ret;
if(here == numbers.size())
if(sum == target) return 1;
else return 0;
ret = 0;
ret += dfs(here + 1, numbers, target, sum + numbers[here]);
ret += dfs(here + 1, numbers, target, sum - numbers[here]);
return ret;
}
int solution(vector<int> numbers, int target) {
int answer = 0;
memset(cache, -1, sizeof cache);
answer = dfs(0, numbers, target, 0);
return answer;
}
|
cs |
Algorithm/TargetNumber.cpp at master · Nor-s/Algorithm (github.com)
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 전화번호 목록 (trie) (0) | 2021.03.10 |
---|---|
[프로그래머스] [C++] 가장 먼 노드 (bfs) (0) | 2021.03.09 |
[프로그래머스] [C++] 체육복 (네트워크 플로, 탐욕법) (0) | 2021.03.06 |
[프로그래머스] [C++] 더 맵게 (queue, heap) (0) | 2021.03.05 |
[프로그래머스] [C++] 완주하지 못한 선수 (map) (0) | 2021.03.05 |