알고리즘/프로그래머스

[C++] 프로그래머스 카운트 다운

이영재의오른발 2024. 4. 1. 17:49
반응형

 

 

전형적인 DP 문제 

 

다트를 던져서 가질 수 있는 점수를 초기화하고 1~100,000 까지의 점수들에 대해 반복문을 돌리면 된다.

 

#include <string>
#include <vector>
#include <set>
#define INF 1e9
using namespace std;

long long dp[100002];
int dp_sum[100002];

set<int> se;
bool check[61];

void init() {
    for(int i=0; i<=100000; i++) {
        dp[i] = INF;
    }
    
    for(int i=1; i<=20; i++) {
        for(int j=1; j<=3; j++) {
            se.insert(i * j);
            dp[i * j] = 1;
            if(j == 1) {
                check[i * j] = true;
                dp_sum[i * j] = 1;
            }
        }
    }
    check[50] = true;
    dp[50] = 1;
    dp_sum[50] = 1;
    se.insert(50);
}

vector<int> solution(int target) {
    vector<int> answer;
    init();
    
    int dart = 0, sum = 0;
    
    for(int i=1; i<=100000; i++) {
        for(int s : se) {
            int tmp = i - s;
            if(tmp <= 0) { continue; }
            
            if(dp[i] == dp[tmp] + 1 && dp_sum[i] <= dp_sum[tmp]) {
                if(check[s]) {
                    dp_sum[i] = dp_sum[tmp] + 1;
                    continue;
                }
                dp_sum[i] = dp_sum[tmp];
            }
            else if(dp[i] > dp[tmp] + 1) {  
                dp[i] = dp[tmp] + 1;
                if(check[s]) {
                    dp_sum[i] = dp_sum[tmp] + 1;
                    continue;
                }
                dp_sum[i] = dp_sum[tmp];
            }
        }
    }
    
    answer.push_back(dp[target]);
    answer.push_back(dp_sum[target]);
    
    return answer;
}

 

 

 

 

728x90
반응형