반응형
문제 설명
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
- 각 숫자는 1 이상 50 이하인 자연수입니다.
- 타겟 넘버는 1 이상 1000 이하인 자연수입니다.
입출력 예
풀이
dfs 문제인데
고민하다가 dfs로 풀기 머리아파서 조합으로 무식하게 풀었다..
시간 초과 날 것 같았는데 통과됐다..
c++
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> getCombinations(vector<int> v, int selectNumber) {
vector<vector<int>> results;
if (selectNumber == 1) {
for(auto ele:v){
vector<int> tmp(1, ele); // 재귀의 마지막 원소 선택
results.push_back(tmp);
}
return results;
}
for(int i=1; i<=v.size(); i++){
int fixed = v[i-1]; // 고정 값
vector<int> rest_v( v.begin()+i, v.end() ); // 나머지
vector<vector<int>> combinations = getCombinations(rest_v, selectNumber - 1);
for(int j=0; j<combinations.size(); j++){
vector<int> tmp; tmp.push_back(fixed);
for( int k=0; k<selectNumber; k++){
tmp.push_back(combinations[j][k]);
}
results.push_back(tmp);
}
}
return results;
}
int solution(vector<int> numbers, int target) {
int answer = 0;
vector<int> v;
int sum = 0;
for(int i=0; i<numbers.size(); i++){
v.push_back(i);
sum += numbers[i];
}
for(int i=1; i<=numbers.size(); i++){
vector<vector<int>> comb = getCombinations(v, i);
for(int j=0; j<comb.size(); j++){
int sum_tmp = sum;
for(int select=0; select<i; select++){
sum_tmp -= ( numbers[ comb[j][select] ] * 2);
}
if(sum_tmp == target) ++answer;
}
}
return answer;
}
아래 코드는 좋아요 많이 받은 분의 코드인데
dfs의 정석이다..
이런 생각을 어떻게 하지 ??
완성된 코드를 봐도 머리속에 잘 그려지지 않는데 이걸 이렇게 짜낸다는게 대단한 거 같다.
#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;
}
javascript
위에 c++로 짠 코드 그대로 옮겼다.
let total = 0;
function DFS(numbers, target, sum, n){
if( n >= numbers.length){
if(sum == target) ++total;
return;
}
DFS(numbers, target, sum + numbers[n], n+1);
DFS(numbers, target, sum - numbers[n], n+1);
}
function solution(numbers, target) {
var answer = 0;
DFS(numbers, target, numbers[0], 1);
DFS(numbers, target, -numbers[0], 1);
answer = total;
return answer;
}
반응형
'IT > 알고리즘' 카테고리의 다른 글
프로그래머스 - 올바른 괄호(c++, javascript) (0) | 2020.10.06 |
---|---|
프로그래머스 - 가장 큰 정사각형 찾기(c++, javascript) (0) | 2020.10.05 |
프로그래머스 - 카펫(c++, javascript) (0) | 2020.09.30 |
프로그래머스 - 구명보트(c++, javascript) [탐욕법] (0) | 2020.09.29 |
프로그래머스 - 위장(c++, javascript) (0) | 2020.09.28 |