쌓고 쌓다

[프로그래머스] 이모티콘 할인행사 C++ 풀이 및 해설 본문

알고리즘/프로그래머스

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

승민아 2024. 2. 14. 22:32

https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=cpp

 

프로그래머스

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

programmers.co.kr

 

풀이 방법

  • 각각의 이모티콘에 모든 할인율을 붙여본다.
  • 할인율에 따른 가입자 수와 판매액을 계산해본다.
  • 가입자를 늘릴 수 있거나 가입자 수는 그대로라도 판매액을 늘릴 수 있다면 답으로 갱신한다.

 

전체 코드

#include <string>
#include <vector>
using namespace std;



void sale(vector<vector<int>> users, vector<int> emoticons, int discount[8], vector<int> &answer) {
    
    int joinCnt = 0; // 가입자 수
    int saleAmount = 0; // 판매액
    
    for(int i=0; i<users.size(); i++) {
        int buyAmount = 0; // 구매 총액

        
        for(int j=0; j<emoticons.size(); j++) {
            if(users[i][0] <= discount[j]) { // 비율 이상의 할인 이모티콘이라면 구매
                buyAmount += emoticons[j]*((double)(100-discount[j])/100);
            }
        }

        
        if(users[i][1] <= buyAmount) // 구매비용을 넘어섰기에. 이모티콘 플러스 가입
            joinCnt++;
        else // 구매 비용 내로 구매 가능
            saleAmount += buyAmount;
    }
    
    // 가입자를 늘릴 수 있거나, 가입수는 같아도 판매액을 늘릴 수 있다면 갱신
    if(answer.size() == 0 || (answer[0] < joinCnt || (answer[0] == joinCnt && answer[1] <= saleAmount))) {
        answer.clear();
        answer.push_back(joinCnt);
        answer.push_back(saleAmount);
    } 
    
}


void bruteforce(vector<vector<int>> &users, vector<int> &emoticons, int discount[8], int idx, vector<int> &answer) {
    
    // 할인율을 모두 채웠다면 판매 시뮬레이션
    if(idx==emoticons.size()) {
        sale(users, emoticons, discount, answer);
        return;
    }
    
    // 할인율 대입
    for(int i=10; i<=40; i+=10) {
        discount[idx] = i;
        bruteforce(users, emoticons, discount, idx+1, answer);
    }
    
}




vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    vector<int> answer;
    
    int discount[8];
    
    // users, emoticons, 할인율 배열, 인덱스, 답
    bruteforce(users, emoticons, discount, 0, answer);
    
    return answer;
}
Comments