プログラマー-多段歯ブラシの販売-C++


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

問題の説明


  • 会社は収益金額の10%を推薦者に振り替える方式で運営している.

  • 歯ブラシ販売情報がvector<int> amount形で提供されると、会社員それぞれの収入が返還される.

  • しかし、問題の10%の収益が1元未満であれば、推薦者に金額を推薦することはありません.
  • 方法


  • 問題では,相互に関連するパラメータを整理してunordered_mapに組み合わせると,あまり困難ではない.
  • enrollのインデックスとreferralのインデックスは互いに同じ従業員を指しているため、unordered_map<string, int> e_idにはenrollの情報が含まれており、名前->インデックスでアクセス可能な資料構造が生成される.
  • sellerおよびamountのインデックスは同じ従業員を指すため、sellerの情報はforに変換される.unordered_map<string, int> ansが生成され、1人当たりの収入が格納される.
  • 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;
    }

    結果