CS/Algorithm

[Programmers][C++] 43165 타겟 넘버

별토끼. 2019. 1. 31. 09:17
반응형

[Programmers][C++] 43165 타겟 넘버

 

문제

https://programmers.co.kr/learn/courses/30/lessons/43165

 

풀이

풀다보니 코드가 지저분하네요ㅠㅠ. 

재귀를 이용해서 숫자 사이 사이에 + 나 -를 넣어줍니다. 백트레킹을 이용해 같은 자리에 두가지를 넣고 재귀를 돌려요. 결과값이 들어가는 string의 길이가 numbers.size의 2배가 되었을 때 계산해줍니다. 이 때 타겟 수와 계산 값이 일치하면 result값을 올려줍니다. 

 

코드

#include <string>
#include <vector>

using namespace std;
int iter;
int res = 0;

int calc(string calc_res) {
    int num_res = 0;
    for (int i = 0; i < calc_res.size(); i++) {
        if (calc_res[i] == '+') {
            num_res += (int)(calc_res[i + 1] - '0');
            i = i + 1;
        }
        else {
            num_res -= (int)(calc_res[i + 1] - '0');
            i = i + 1;
        }
    }
    return num_res;
}

void getRes(vector<int> numbers, string calc_res, int len, int target) {

    
    if (len==numbers.size()) {
        if (calc(calc_res) == target) {
            res += 1;
            return;
        }

        return;
    }
    len = len + 1;
    calc_res += '+';
    calc_res += (char)(numbers[len - 1]+(int)'0');
    getRes(numbers, calc_res, len, target);

    calc_res.erase(calc_res.size() - 1);
    calc_res.erase(calc_res.size() - 1);
    calc_res += '-';
    calc_res += (char)(numbers[len - 1]+(int)'0');
    getRes(numbers, calc_res, len, target);
}
int main() {
    int answer = 0;
    vector<int> numbers;
    for (int i = 0; i < 5; i++) {
        numbers.push_back(1);
    }

    int target = 3;
    getRes(numbers, "", 0, target);
    answer = res;
    printf("%d", answer);
    return 0;
}

 

반응형