https://school.programmers.co.kr/learn/courses/30/lessons/77486
판매원은 추천인에게 10%의 수익을 주고, 나머지는 본인이 가진다. 최종적으로 판매원들이 가지는 수익 반환하기
칫솔을 하나 판매해서 얻을 수 있는 이익 : 100원
Input
각 판매원의 이름 enroll, 각 판매원을 조직에 참여시킨 다른 판매원의 이름 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량 amount
Output
각 판매원이 득한 이익금
문제 설명대로 구현하면 되는 간단한 문제다. 재귀를 활용해서 주어진 profit에 대해 추천인으로 타고 가면서 수익 분배하는 식으로 구현했다.
using System;
using System.Collections.Generic;
public class Solution {
private Dictionary<string, int> enrollToIndex;
private int[] answer;
public int[] solution(string[] enroll, string[] referral, string[] seller, int[] amount) {
enrollToIndex = new Dictionary<string, int>();
enrollToIndex["-"] = -1;
for (int i = 0; i < enroll.Length; i++)
{
enrollToIndex[enroll[i]] = i;
}
answer = new int[enroll.Length];
// seller 순회 => amount 만큼 결과 계산 및 10% 수익떼서 referral에게 주기
for (int i = 0; i < seller.Length; i++)
{
string currentSeller = seller[i];
int profit = amount[i] * 100; // 수익 (판매한 칫솔 개수 * 100원)
DistributeProfit(enrollToIndex[currentSeller], profit, referral);
}
return answer;
}
private void DistributeProfit(int sellerIndex, int profit, string[] referral)
{
if (sellerIndex == -1) return; // center까지 분배 끝난 경우
int referralIndex = enrollToIndex[referral[sellerIndex]]; // 추천인 index
int profitToDistribute = profit / 10;
int remainedProfit = profit - profitToDistribute;
answer[sellerIndex] += remainedProfit; // 분배 후 남은 금액 추가
if (profitToDistribute > 0) // 분배해야하는 경우
{
DistributeProfit(referralIndex, profitToDistribute, referral);
}
}
}