https://programmers.co.kr/learn/courses/30/lessons/77486
코딩테스트 연습 - 다단계 칫솔 판매
민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,
programmers.co.kr
import java.util.*;
class Solution {
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
HashMap<String, Integer> hs = new HashMap<>();
Node person[] = new Node[enroll.length+1];
for(int i=0; i<enroll.length+1; i++){
person[i] = new Node();
}
enroll(enroll, hs);
union(enroll, referral, hs, person);
calculate(seller, amount, hs, person);
int[] answer = new int[enroll.length];
for(int i=0; i<enroll.length; i++){
answer[i] = person[i+1].result;
}
return answer;
}
private void calculate(String[] seller, int[] amount, HashMap<String,Integer> hs ,Node[] person){
int sellerSize = seller.length;
for(int i=0; i<sellerSize; i++){
int value = 100*amount[i];
int remain = value * 10 / 100;
if(remain > 0){
person[hs.get(seller[i])].result += (value - remain);
dfs(person[hs.get(seller[i])].parent, remain);
}
else{
person[hs.get(seller[i])].result += value;
}
}
}
private void dfs(Node cur, int value){
if(cur.parent == null) {
return;
}
int remain = value * 10 / 100;
if(remain > 0) {
cur.result += value - remain;
dfs(cur.parent, remain);
}
else{
cur.result += value;
}
}
private void union(String[] enroll, String[] referral, HashMap<String,Integer> hs, Node[] person){
int personSize = enroll.length;
for(int i=0; i<personSize; i++){
if(referral[i].equals("-")){
person[hs.get(enroll[i])].parent = person[0];
}
else{
person[hs.get(enroll[i])].parent = person[hs.get(referral[i])];
}
}
}
private void enroll(String[] enroll, HashMap<String,Integer> hs){
hs.put("center", 0);
int idx = 1;
for(String name : enroll){
hs.put(name, idx++);
}
}
class Node{
Node parent;
int result;
int amount;
}
}
우선 사람들의 이름을 HashMap을 이용해서 인덱스화하여 사용했다.
판매량이 주어지면 그 판매한 사람에서 시작하여 부모에게 10%값을 전달해야 하기 때문에
노드 클래스에는 parent와 현재 노드의 총액, 판매량을 정의했다.
1. 이름을 인덱스로
2. 각 노드의 부모를 등록
3. amount를 순회하면서 10%를 부모에게 전달
'알고리즘' 카테고리의 다른 글
[백준] 게임 개발 1516 - java (0) | 2021.08.16 |
---|---|
[백준] 오큰수 17298 - java (0) | 2021.07.29 |
[백준] 문자열 폭발 9935 - java (0) | 2021.07.23 |
[백준] 파티 1238 - java (0) | 2021.07.20 |
[백준] 친구 네트워크 4195 - java (0) | 2021.07.19 |