[프로그래머스]

프로그래머스 이모티콘 할인행사 C++

Hevton 2023. 9. 8. 15:15
반응형

할인율이 10, 20, 30, 40로 4가지 밖에 안되며

이모티콘 총 갯수의 상한선도 7개밖에 안된다

 

이는 모든 경우의 수를 탐색해도 4의 7승이므로 제한시간 내에 가능하다.

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> sales; // 세일
vector<pair<int, int>> answer;

// 할인률을 10, 20, 30, 40 까지 경우의 수
// 내림차순으로 해서, 첫 전환점까지 하면 될 것 같은데

// 40 40 40 40 40 40 40
// 10 10 10 10 10 10 10 ~ 40 40 40 40 40 40 40 모든 경우 수

void calculate(vector<vector<int>>& users, vector<int>& emoticons) {

    int totalSubscribe = 0;
    int totalPrice = 0;
    
    for(int i = 0; i < users.size(); i++) {
        
        int price = 0;

        
        for(int j = 0; j < emoticons.size(); j++) {
            if(users[i][0] <= sales[j]) {
                price += emoticons[j] - (emoticons[j] * sales[j] / 100);
            }
        }
        
        if(price >= users[i][1]) {
            totalSubscribe++; // 프리미엄 가입
        } else {
            totalPrice += price;
        }
    }
    
    answer.push_back({totalSubscribe, totalPrice});
}

void dfs(vector<vector<int>>& users, vector<int>& emoticons) {
    
    if(sales.size() == emoticons.size()) {
        calculate(users, emoticons);
        return;
    }
    
    for(int j = 10; j <= 40; j+= 10) {
        sales.push_back(j);
        dfs(users, emoticons);
        sales.pop_back();
    }
}

vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    
    dfs(users, emoticons);
    
    sort(answer.begin(), answer.end(), greater<>());
    
    return {answer[0].first, answer[0].second};

}

 

 

반응형