알고리즘/프로그래머스
[프로그래머스] [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 |
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+
programmers.co.kr
Algorithm/TargetNumber.cpp at master · Nor-s/Algorithm (github.com)
Nor-s/Algorithm
Contribute to Nor-s/Algorithm development by creating an account on GitHub.
github.com