문제
- 링크
title: "코딩테스트 연습 - 다단계 칫솔 판매" image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg" description: "민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후, 조직을 운영하던 민호는 조직 내 누가 얼마만큼의 이득을 가져갔는지가 궁금해졌습니다. 예를 들어, 민호가 운영하고 있는 다단계 칫솔 판매 조직이 아래 그림과 같다고 합시다." url: "https://school.programmers.co.kr/learn/courses/30/lessons/77486"문제 풀이
문제 접근
- 데이터 준비:
enroll: 멤버 이름을 기준으로 인덱스를 매핑합니다.referral: 각 멤버의 추천인을ref_index배열로 변환합니다. 추천인이 없으면-1로 설정합니다.seller: 판매자의 인덱스를sel_index배열로 변환합니다.- 수익 분배 계산:
- 각 판매자가 발생시킨 판매 금액(
amount)에 대해, 총 수익을 계산하고 이를 추천 구조를 따라 분배합니다. - 수익의 10%를 추천인에게 전달하며, 남은 금액은 현재 판매자의 수익으로 기록됩니다.
- 이 과정을 추천 체계의 끝까지 반복하거나, 분배할 금액이 1 미만일 때 종료합니다.
- 결과 반환:
- 최종적으로 각 판매자의 수익을
answer배열에 저장하여 반환합니다.간단한 수도 코드 정리
```pseudocode function solution(enroll, referral, seller, amount): answer = array of zeros with size of enroll ref_index = map referral to index of enroll (or -1 if no referral) sel_index = map seller to index of enroll
for i from 0 to length of seller - 1: index = sel_index[i] // current seller’s index money = amount[i] * 100 // total revenue from sales
while index is not -1: reward = floor(money * 0.1) // 10% of revenue if ref_index[index] is -1: // no referral add (money - reward) to answer[index] else if reward < 1: // if reward is too small add money to answer[index] break else: add (money - reward) to answer[index] index = ref_index[index] // move to next referral money = reward // pass reward upwardsreturn answer
---
## 풀이 코드
```java
[Type/Paste Your Code](<import java.util.*;
class Solution {
public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
int[] answer = new int[enroll.length];
int[] ref_index = new int[referral.length];
int[] sel_index = new int[seller.length];
ArrayList%3CString%3E en_str = new ArrayList<>(Arrays.asList(enroll));
// init
for (int i = 0; i < enroll.length; i++) {
answer[i] = 0;
ref_index[i] = en_str.indexOf(referral[i]); // ref에 해당되는 인덱스 저장, "-"는 -1
}
for (int i = 0; i < seller.length; i++) {
sel_index[i] = en_str.indexOf(seller[i]);
}
// calculation
for (int i = 0; i < seller.length; i++) {
int index = sel_index[i]; // seller의 인덱스
int money = amount[i] * 100; // seller의 판매 수입
while (index != -1) {
int reward = (int)(money * 0.1);
if (ref_index[index] == -1) {
answer[index] += money - reward;
} else if (reward < 1) {
answer[index] += money;
} else {
answer[index] += money - reward;
}
index = ref_index[index];
money = reward;
}
}
return answer;
}
}>)