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

 

https://school.programmers.co.kr/learn/courses/30/lessons/150368

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

해결전략

 

구현

깊이우선탐색 DFS

 


 

정답코드

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n, m;
vector<int> answer(2);
int discount[4] = { 10, 20, 30, 40 };

vector<pair<int, int>> price(7); // 이모티콘 가격, 할인율

void DFS(int idx, const vector<vector<int>>& users, const vector<int>& emo)
{
    if(idx == m)
    {
        int ppl = 0, sumPrice = 0; // ppl: 구독자 수, sumPrice: 이모티콘들을 구매해서 지불해야할 비용
        for(int i = 0; i < n; i++)
        {
            int temp = 0; // 이모티콘 구매비용
	        for(int j = 0; j < m; j++){
		        if(users[i][0] <= price[j].second){ // 할인율을 만족해 이모티콘을 구입하는 경우
                    temp += price[j].first; // 구매비용 누적
		        }
	        }

            if(temp >= users[i][1]){ // 구매비용이 사용자가 준비한 금액보다 많은 경우 구독
                ppl++;
            }
            else{ 
                sumPrice += temp; 
            }
        }

        if(answer[0] < ppl){ // 가입자 수가 더 많은 경우 갱신 
            answer[0] = ppl;
            answer[1] = sumPrice;
        }
        else if (answer[0] == ppl && answer[1] <= sumPrice) { // 가입자 수는 같지만 구매비용이 더 많은 경우
            answer[1] = sumPrice;
        }

        return;
    }
	
    for (int i = 0; i < 4; i++)
    {
        price[idx].first = (100 - discount[i]) * emo[idx] / 100; // 할인된 이모티콘 가격
        price[idx].second = discount[i]; // 할인율
        DFS(idx + 1, users, emo);
    }
}

vector<int> solution(vector<vector<int>> users, vector<int> emo) {
    n = users.size();
    m = emo.size();

    DFS(0, users, emo);

    return answer;
}

int main(){
    vector<vector<int>> test1 = { {40, 10000}, {25, 10000} };
    vector<vector<int>> test2 = { {40, 2900},{23, 10000},{11, 5200},{5, 5900},{40, 3100},{27, 9200},{32, 6900 }};
    vector<int> testcase1 = { 7000, 9000 };
    vector<int> testcase2 = { 1300, 1500, 1600, 4900 };

    solution(test1, testcase1);
    solution(test2, testcase2);

    return 0;
}