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

 

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

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

programmers.co.kr

<풀이>

1. 다단계 조직도와 판매 정보를 입력받는다.

2. 판매 이익을 자신의 추천인과 재분배하고, 각 사람들의 이익을 반환한다.

 

<해법>

1. 다단계 조직도를 정리하는 방법

=> 사람마다 자신의 추천인을 저장해놓습니다. map자료구조를 사용하여 key, value를 각각 이름으로 해놓을 수도 있습니다. 저는 실행시간 단축을 위해, 각 사람마다 인덱스(번호)를 부여하였고, 추천인 배열을 만들어서 사람의 인덱스에 추천인의 인덱스를 저장해놓는 방식으로 구현하였습니다.

 

2. 추천인과 이익을 재분배하는 방법

=> 추천인 배열을 통해 추천인이 민호가 될 때까지 이익을 재분배합니다. 저는 재귀함수를 이용하였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <string.h>
 
using namespace std;
 
map<stringint> m;
int parent[10000];
int profits[10000];
 
//이익 분배 함수
void divideProfit(int index, int profit) {
 
    //종료조건 : 민호까지 왔을 경우
    if (index == -1) {
        return;
    }
 
    //이익 분배
    int stolen = profit / 10;
    int myProfit = profit - stolen;
    profits[index] += myProfit;
 
    //종료조건 : 더 이상 나눌 이익이 없을 경우
    if (stolen == 0) {
        return;
    }
 
    //재귀
    divideProfit(parent[index], stolen);
}
 
vector<int> solution(vector<string> enroll, vector<string> referral, vector<string> seller, vector<int> amount) {
    vector<int> answer;
 
    //초기화
    memset(parent, 0sizeof(parent));
    memset(profits, 0sizeof(profits));
 
 
    /* 해법 */
    //1. 맵 자료구조에 {'이름' : 'index'} 저장
    for (int i = 0; i < enroll.size(); i++) {
        m[enroll[i]] = i;
    }
 
    //2. 각 index마다 추천인 index 저장
    for (int i = 0; i < referral.size(); i++) {
        if (referral[i] == "-") {
            parent[i] = -1;
        }
        else {
            parent[i] = m[referral[i]];
        }
    }
 
    //3. 이익분배
    for (int i = 0; i < seller.size(); i++) {
        divideProfit(m[seller[i]], amount[i] * 100);
    }
 
    //결과 저장
    for (int i = 0; i < enroll.size(); i++) {
        answer.push_back(profits[i]);
    }
 
    //결과 반환
    return answer;
}
 

 

자료구조와 재귀함수에 대해 알아볼 수 있는 문제였습니다.

+ Recent posts