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 | 
 
                  