와이유스토리

[DFS 중복순열] 프로그래머스 이모티콘 할인행사 C++ 본문

코딩테스트/그래프|트리

[DFS 중복순열] 프로그래머스 이모티콘 할인행사 C++

유(YOO) 2023. 1. 19. 15:34
#include <string>
#include <vector>

using namespace std;

int discount[8];
vector<int> answer(2, 0);

// 사용자 금액 계산
void check(vector<vector<int>> users, vector<int> emoticons) {
    int cnt = 0;
    int sales = 0;
    for(int i=0; i<users.size(); i++) {
        int price = 0;
        for(int j=0; j<emoticons.size(); j++) {
            // 이모티콘 구입
            if (users[i][0] <= discount[j]) {
                price += emoticons[j]*(100-discount[j])*0.01;
            }
        }
        
        // 이모티콘 플러스 서비스 가입
        if (price >= users[i][1]) cnt++;
        else sales += price;
    }
    
    // 최대 가입자 수 및 매출액
    answer = max(answer, {cnt, sales});
}

// 이모티콘 - 할인율 DFS 중복 순열
void dfs(int depth, vector<vector<int>> users, vector<int> emoticons) {
    if (depth == emoticons.size()) {
        // 사용자 금액 계산
        check(users, emoticons);
        return;
    }
    
    for(int i=1; i<=4; i++) {
        discount[depth] = i*10;
        dfs(depth+1, users, emoticons);
    }
}

vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    // 이모티콘 - 할인율 DFS 중복 순열
    dfs(0, users, emoticons);
    return answer;
}
#include <string>
#include <vector>
#include <set>
#include <iostream>

using namespace std;

set<int> s;
int discount[8];
int maxCnt, maxSales;

// 사용자 금액 계산
void check(vector<vector<int>> users, vector<int> emoticons) {
    int cnt = 0;
    int sales = 0;
    for(int i=0; i<users.size(); i++) {
        int price = 0;
        for(int j=0; j<emoticons.size(); j++) {
            // 이모티콘 구입
            if (users[i][0] <= discount[j]) {
                price += emoticons[j]*(100-discount[j])*0.01;
            }780 1095 1088 2940   5903 5903 4808
        }
        // 이모티콘 플러스 서비스 가입
        if (price >= users[i][1]) cnt++;
        else sales += price;
    }
    if (cnt == 4) cout << cnt << " " << sales << "\n";
    if (cnt > maxCnt) {
        maxCnt = cnt;
        maxSales = sales;
    }
    else if ((cnt == maxCnt) &&(sales > maxSales)) {
        maxSales = sales;
    }
}

// 이모티콘 - 할인율 DFS 중복 순열
void dfs(int depth, vector<vector<int>> users, vector<int> emoticons) {
    if (depth == emoticons.size()) {
        check(users, emoticons);
        for(int i=0; i<emoticons.size(); i++) {
            cout << discount[i] <<" ";
        }
        cout << "\n";
        return;
    }
    
    for(auto e : s) {
        discount[depth] = e;
        dfs(depth+1, users, emoticons);
    }
}

vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    // 할인율 집합
    for(int i=0; i<users.size(); i++) s.insert(users[i][0]);
    
    // 이모티콘 - 할인율 DFS 중복 순열
    dfs(0, users, emoticons);
    
    vector<int> answer;
    answer.push_back(maxCnt);
    answer.push_back(maxSales);
    
    return answer;
}
Comments