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_id
에 enroll
정보를 담아두어 이름->Index 로 접근 할 수 있게 자료구조를 생성한다.
seller
와 amount
도 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;
}
결과