문제

  • 링크
    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"
    

    문제 풀이

    문제 접근

    1. 데이터 준비:
    • enroll: 멤버 이름을 기준으로 인덱스를 매핑합니다.
    • referral: 각 멤버의 추천인을 ref_index 배열로 변환합니다. 추천인이 없으면 -1로 설정합니다.
    • seller: 판매자의 인덱스를 sel_index 배열로 변환합니다.
      1. 수익 분배 계산:
    • 각 판매자가 발생시킨 판매 금액(amount)에 대해, 총 수익을 계산하고 이를 추천 구조를 따라 분배합니다.
    • 수익의 10%를 추천인에게 전달하며, 남은 금액은 현재 판매자의 수익으로 기록됩니다.
    • 이 과정을 추천 체계의 끝까지 반복하거나, 분배할 금액이 1 미만일 때 종료합니다.
      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 upwards
    

    return 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;
    }
}>)