본문 바로가기
알고리즘

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

by minkang 2021. 7. 27.

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