코딩테스트 문제풀이

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

지잉지잉 2021. 10. 12. 23:27

문제

 

풀이

import java.util.*;
class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int len = enroll.length;
        int[] answer = new int[len];
        
        Map<String, String> parentMap = new HashMap<String, String>();
        for (int i = 0; i < len; i++) {
            parentMap.put(enroll[i], referral[i]);
        }
        
        Map<String, Integer> map = new HashMap<String, Integer>();
        
        for (int i = 0; i < seller.length; i++) {
            int sum = amount[i] * 100;
            divide(parentMap, map, seller[i], sum);
        }
        
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()) {
            String person = iterator.next();
            for (int i = 0; i < len; i++) {
                if (enroll[i].equals(person)) {
                    answer[i] = map.get(person);
                }
            }
        }
        
        return answer;
    }
    
    public void divide(Map<String, String> parentMap, Map<String, Integer> map, String seller, int amount) {
        
        String parent = parentMap.get(seller);
        if (parent == null) {
            return;
        }
        
        int dividedAmount = amount / 10;
        if (dividedAmount == 0) {
            map.put(seller, map.getOrDefault(seller, 0) + amount);
            return;
        }
        
        map.put(seller, map.getOrDefault(seller, 0) + amount - dividedAmount);
        
        divide(parentMap, map, parent, dividedAmount);
    }
}
  • 재귀를 통해 금액을 가장 루트노드에 도착할 때 까지 10:90으로 나누어 배분한다.

출처: https://programmers.co.kr/learn/courses/30/lessons/77486