프로그래머스 - 다단계 칫솔 판매 - C++

hansol_Shin·2021년 5월 13일
0

Algorithm

목록 보기
7/12
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/77486

문제설명

  • 수익 금액에서 10%를 추천인에게 전달하는 방식으로 회사가 운영된다.

  • 칫솔 판매량 정보가 vector<int> amount로 주어질 때, 회사 직원이 각자 받는 수입을 return하는 문제이다.

  • 단, 문제에서 수익금의 10%가 1원 미만일 시 추천인에게 추천 금액을 주지 않는다.

접근 방법

  • 문제에서 서로 연관된 파라메터를 잘 정리하여 unordered_map 으로 묶어주면 크게 어렵지 않은 문제이다.

  • enroll의 index와 referral의 index가 서로 같은 직원을 가르키므로 unordered_map<string, int> e_idenroll정보를 담아두어 이름->Index 로 접근 할 수 있게 자료구조를 생성한다.

  • selleramount도 index가 같은 직원을 가르키기에 seller의 정보를 for로 돌면서
    각 사람들의 수입을 저장할 unordered_map<string, int> ans를 생성한다.

  • seller에 대한 for 안에서 while로 referral에게 추천금액을 전달하며 조건까지 반복하면된다.

  • 코드로 직접 보자!

풀이

#include <string>
#include <vector>
#include <unordered_map>

using namespace std;
unordered_map<string,int> e_id;     // enroll, referral에 사용 가능한 idx table
unordered_map<string,int> ans;      // 이름, 총 수익 금액이 들어갈 table

vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    vector<int> answer;
    for(int i=0;i<enroll.size();i++){
        e_id[enroll[i]] = i;
    }
    
    // 비지니스 로직
    for(int i=0;i<seller.size();i++){
        int total = amount[i]*100;
        string tmp = seller[i];
        int recom_cost = total*0.1;
        ans[tmp] += total*0.9;
        while(referral[ e_id[ tmp ] ] != "-" || recom_cost != 0){
            // 1원 미만이면 추천인 cost를 지불하지 않음
            ans[referral[e_id[tmp]]] += recom_cost-int(recom_cost*0.1);
            recom_cost *= 0.1;
            tmp = referral[e_id[tmp]];
        }
    }
    
    for(int i=0;i<enroll.size();i++){
        answer.push_back(ans[enroll[i]]);
    }
    
    return answer;
}

결과

profile
늘 완벽하고싶다.

0개의 댓글