풀이

하나는 referral 의 인덱스값(참조값)을 저장할 배열을 만들고, 또 하나에는 배분 받은 수익을 저장하는 배열을 만들면 쉽게 풀 수 있는 문제.

그러나 이런 절차지향적 코드는 읽기 어려울 것이라고 생각해서, 객체 지향적으로 "직원"이 있다고 생각하고 직원은 각각의 "추천직원"에 대한 참조 값을 저장하는 방법으로 접근하였음

public class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
				// 직원의 참조 값을 저장
        List<Employee> employees = new ArrayList<>();
        Employee center = new Employee("민호", null);
        employees.add(center);

				// 추천인이 없으면 center 가 부모가 되고 있으면 해당 추천인이 부모가 됨
        for (int i=0; i<enroll.length; i++) {
            if ("-".equals(referral[i]))
                employees.add(new Employee(enroll[i], center));
            else
                employees.add(new Employee(enroll[i], findEmployee(employees, referral[i])));
        }

				// 수익 배분 시작
        for (int i=0; i<seller.length; i++) {
            findEmployee(employees, seller[i]).setProfit(amount[i] * 100);
        }

        employees.remove(0);
        return employees.stream().mapToInt(s -> s.getProfit()).toArray();
    }

		// 직원을 찾습니다.
    public Employee findEmployee(List<Employee> employees, String name) {
        for (int i=employees.size() - 1; i>0; i--) {
            if (employees.get(i).getName().equals(name))
                return employees.get(i);
        }
        return null;
    }

    static class Employee {
				// 직원의 이름
        private String name;
				// 추천인
        private Employee referral;
				// 자신이 배분받을 수익
        private int profit;

        public Employee(String name, Employee referral) {
            this.name = name;
            this.referral = referral;
        }

				// 자신이 수익을 배분 받으면 자동으로 추천인을 찾아 10 % 를 나눈다.
        public void setProfit(int profit) {

            if (referral == null)
                this.profit += profit;
            else {
                int rest = profit / 10;

                if (rest >= 1)
                    referral.setProfit(rest);

                this.profit += profit - rest;
            }
        }

        public int getProfit() {
            return profit;
        }

        public String getName() {
            return name;
        }
    }
}