어흥

[프로그래머스] 다단계 칫솔 판대 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 다단계 칫솔 판대 (C++)

라이언납시오 2021. 5. 4. 19:09
728x90
반응형

문제 링크: programmers.co.kr/learn/courses/30/lessons/77486

 

코딩테스트 연습 - 다단계 칫솔 판매

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

programmers.co.kr

1. 주의할 점

- Map을 통해 String과 Int를 연관시킨다

- 조건에 알맞게 구현한다

 

2. 구현

- Map m에 사람과 번호를 매칭시킨다

- Map을 통해 각 사람을 등록시킨 사람 Par을 설정한다

- Seller 벡터를 통해 판매원이 전달된 수익을 Money에 할당하고, Cur을 통해 현재 사람을 가리킨다. Cur이 0보다 클때까지 While문을 수행한다(Center 전까지)

- Money가 10원보다 작으면 현재 haveMoney[Cur]에 돈을 다 할당하고 종료하고 10원보다 크다면 90%를 현재 haveMoney[Cur]에 저장하고 상위 사람에게 향하고 남은 금액을 가지도록 Cur과 Money를 갱신한다

#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
map<string,int> m;
int par[10001];
int haveMoney[10001];

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++){
        string str = enroll[i];
        m[str]=i+1;
    }
    
    for(int i=0;i<enroll.size();i++){
        int c = m[enroll[i]];
        int p;
        string s = referral[i];
        if(s=="-") p=0;
        else p = m[referral[i]];
        par[c]=p;
    }
    
    for(int i=0;i<seller.size();i++){
        int money = amount[i]*100;
        int cur = m[seller[i]];
        while(cur>0){
            int p = par[cur];
            if(money<10){
                haveMoney[cur]+=money;
                break;
            }
            int tenPer = money/10;
            haveMoney[cur]+=(money-tenPer);
            money=tenPer;
            cur = p;
        }
    }
    for(int i=0;i<enroll.size();i++){
        string str = enroll[i];
        answer.push_back(haveMoney[m[str]]);
    }    
    return answer;
}
728x90
반응형
Comments