선택은 나의 것

[프로그래머스] 다단계 칫솔 판매 본문

☽ Algorithm/Programmers

[프로그래머스] 다단계 칫솔 판매

Algoribi 2021. 7. 9. 13:20

문제

Programmers 다단계 칫솔 판매 : https://programmers.co.kr/learn/courses/30/lessons/77486

 

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

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

programmers.co.kr

코드

#include <iostream>
#include <map>
#include <vector>

#define endl "\n"

using namespace std;

vector<int> member[10010], answer, zero;
map<string, int> m;
map<int, vector<int>> sell;
int number;

vector<int> dfs(int x) {
    vector<int> re;
    for (int i = 0; i < member[x].size(); i++) {
        vector<int> add = dfs(member[x][i]);
        for (int j = 0; j < add.size(); j++) {
            re.push_back(add[j] / 10);
            answer[x] += add[j] - add[j] / 10;
        }
    }
    if (sell.find(x) != sell.end()) {
        for (int i = 0; i < sell[x].size(); i++) {
            re.push_back(sell[x][i] / 10);
            answer[x] += sell[x][i] - re[re.size() - 1];
        }
    }
    return re;
}

void sol(int x) {
    for (int i = 0; i < zero.size(); i++)
        dfs(zero[i]);
    return;
}

vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    number = enroll.size();
    for (int i = 0; i < enroll.size(); i++) {
        answer.push_back(0);
        m[enroll[i]] = i;
        if (referral[i] == "-")
            zero.push_back(i);
        else
            member[m[referral[i]]].push_back(i);
    }
    for (int i = 0; i < seller.size(); i++)
        sell[m[seller[i]]].push_back(amount[i] * 100);
    sol(0);
    return answer;
}

 

깃 허브 주소 : https://github.com/algoribi/algorithm-study

Comments