Study hard
(c++) 프로그래머스 코딩테스트 연습 - 타겟 넘버 본문
programmers.co.kr/learn/courses/30/lessons/43165
코딩테스트 연습 - 타겟 넘버
n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+
programmers.co.kr
[풀이]
dfs 중복 순열을 구하여 푸는 문제였다.
-는 0, +는 1로 표시하여 0과 1로 이루어진 numbers의 크기와 같은 중복 순열을 구하고, 각 경우에 대해 연산 결과와 target값을 비교하였다.
중복 순열: n개의 수 중 r개의 수를 중복을 허용하여 한 줄로 나열하는 경우의 수. 순서가 다르면 다른 경우로 침.
#include <string>
#include <vector>
using namespace std;
int n_cnt;
int tar_cnt=0;
vector<int>Num;
int Op[20];//연산자 순서대로 저장 0:-, 1:+
int getAns(){
int ans=0;
for(int i=0;i<n_cnt;i++){
if(Op[i]==0){
ans-=Num[i];
}
else{
ans+=Num[i];
}
}
return ans;
}
//중복 순열 만들기
void getOp(int cnt, int target){
if(cnt==n_cnt){
int ans = getAns();
if(ans==target)
tar_cnt++;
return;
}
for(int i=0;i<=1;i++){
Op[cnt]=i;
getOp(cnt+1,target);
}
}
int solution(vector<int> numbers, int target) {
int answer = 0;
Num=numbers;
n_cnt=numbers.size();
getOp(0, target);
answer=tar_cnt;
return answer;
}
'프로그래머스 > bfs, dfs' 카테고리의 다른 글
(c++)프로그래머스 코딩테스트 연습 - 단어 변환 (0) | 2020.10.19 |
---|---|
(c++)프로그래머스 코딩테스트 연습 - 네트워크 (0) | 2020.10.19 |