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

ksp7331·2023년 11월 4일

문제 주소

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

풀이 과정

트리구조로 되어있는 판매망에서, 아래에서부터 위로 수익을 분배해야 되는 문제이다.

자신이 칫솔을 판매하든, 추천한 사원으로부터 수익을 받든, 그 수익을 분배하는 로직은 같으므로 코드를 재사용할 수 있을것이라고 생각했다. 이를 위해 각 사원을 객체화하고, 그 객체에 수익분배를 하게 해주는 메서드를 만들어서 실행했다.

위로 전달한 수익은 다시 분배해야 하므로 위로 전달하는 과정을 수익분배 메서드를 통해 실행했다. 이를 위해, 사원 객체의 필드로 추천한 사원을 넣었다(refer.allocate(bonus))(물론, 트리구조로 만들기 위해서는 당연히 해당 필드가 필요하다.)

최종 코드

import java.util.*;
class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        Map<String, Worker> map = new HashMap<>();
        map.put("-", new Worker("root"));
        for(int i = 0; i < enroll.length; i++){
            String name = enroll[i];
            Worker worker = new Worker(name);
            worker.refer = map.get(referral[i]);
            map.put(name, worker);
        }
        
        for(int i = 0; i < seller.length; i++){
            map.get(seller[i]).allocate(amount[i] * 100);
        }
        return Arrays.stream(enroll).mapToInt(s -> map.get(s).sale).toArray();
    }
    private class Worker{
        String name;
        Worker refer;
        int sale;
        public Worker(String name){
            this.name = name;
        }
        public void allocate(int sale){
            if(refer != null){
                int bonus = sale / 10;
                refer.allocate(bonus);
                this.sale += (sale - bonus);
            } else {
                this.sale += sale;
            }
        }
    }
}

0개의 댓글