https://programmers.co.kr/learn/courses/30/lessons/77486
코딩테스트 연습 - 다단계 칫솔 판매
민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,
programmers.co.kr
[문제]
[풀이]
트리구조로 짜여진 다단계 구조에서 자기가 수익을내면 10%는 부모에게 올라가고
부모도 그 부모에게 10%가 올라가는 방식이다.
처음엔 단순 dfs 로 하려고 했다가 실패했다 ..
한 사람이 두 번 이상 판매해서 수익을 발생시키고 그 수익금을 합쳐서 올리는게 아니라
따로따로 계산해서 1원미만 단위가 나오면 취급하지 않기 때문인데 .. 이게 무슨말이냐면
가령 , A라는 사람의 발생수익이 5원 5원이라고 하자. 그럼 10원이라서 그 부모에게 1원을 줘야하는데
여기선 따로취급해야하기 때문에 5원의 10%는 0원을 두 번 처리해야 된다는 뜻.
이것만 조심하면 풀 수 있다.
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
|
import java.util.*;
import java.io.*;
import java.util.stream.*;
class Solution {
Map<String,Node> table;
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
table = new HashMap<String, Node>();
Node center = new Node("center",enroll.length);
table.put("center",center);
for(int i=0;i<enroll.length;i++) table.put(enroll[i],new Node(enroll[i],i));
for(int i=0;i< referral.length;i++) {
if(referral[i].equals("-")) table.get(enroll[i]).parent="center";
else table.get(enroll[i]).parent = referral[i];
}
int[] result = new int[enroll.length];
for(int i=0;i<seller.length;i++){
int profit = amount[i]*100;
Node cur = table.get(seller[i]);
while (!cur.name.equals("center")){
int parentProfit = profit/10;
result[cur.key] += profit-parentProfit;
cur = table.get(cur.parent);
profit = parentProfit;
if(profit<1) break;
}
}
System.out.println("Arrays.toString(result) = " + Arrays.toString(result));
return result;
}
static class Node{
String name,parent;
int key;
public Node(String name,int key) {
this.name = name;
this.parent = null;
this.key=key;
}
}
}
|
cs |
'알고리즘,PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [Level2] 메뉴 리뉴얼 JAVA (0) | 2021.11.15 |
---|---|
[프로그래머스] [Level3] 합승 택시 요금 JAVA (0) | 2021.11.13 |
[프로그래머스] [Level3] 여행경로 JAVA (0) | 2021.11.03 |
[프로그래머스] [위클리 챌린지 12주차] 피로도 JAVA (0) | 2021.10.25 |
[프로그래머스] [Level2] 소수찾기 JAVA (0) | 2021.10.20 |