알고리즘/프로그래머스 Level3

[프로그래머스,자바] Level3: 다단계 칫솔 판매

류창 2021. 9. 28. 23:23
반응형

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

 

코딩테스트 연습 - 다단계 칫솔 판매

민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

programmers.co.kr

문제분석

문제가 길어서 링크로 대체합니다.

 

배열의 길이가 같은 enroll 과 referral이 주어집니다. 

이 enroll은 판매자를 나타내고, referral은 판매자와의 상속관계를 나타냅니다.

 

배열의 길이가같은 seller와 amount가 주어집니다.

seller는 수익을 낸 판매자를 나타내고, amount는 판매자의 칫솔갯수를 나타냅니다.

 

목표:모든 참가자의 수익 계산하기

 

수익을 측정할때 특수한 규칙이 적용됩니다.

 

자식 판매자가 수익을내면 90%를가져가고, 부모에게 10%를 줍니다.

부모 역시 그 값의 90%를 본인이 가져간뒤, 10%를 부모에게 드립니다.

이와 같은 규칙을 반복하다가, 수익이 1원 미만이 되면 본인이 전부가집니다.

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
class Solution {
    public int[] solution (String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];
        
        Map<String,String> root = new HashMap<>();
        Map<String,Integer> total= new HashMap<>();
        
        for(int i=0;i<enroll.length;i++){
            if(referral[i].equals("-")){
              root.put(enroll[i],"center");   
            }          
            else{
             root.put(enroll[i],referral[i]);                  
            }
            total.put(enroll[i],0);
        }
        
        for(int i=0;i<seller.length;i++){
           String kid=seller[i];
           String parent=root.get(seller[i]);
           int money=amount[i]*100;
           while(true){
               total.put(kid,total.get(kid)+money-money/10);
               money/=10;
               if(money==0||parent.equals("center")){
                   break;
               }
               
               kid=parent;
               parent=root.get(kid);                            
           }
        }
        
       for(int i=0;i<enroll.length;i++){
           answer[i]=total.get(enroll[i]);
       }
        
        return answer;
    }
}
cs

 

2개의 맵을 생성했습니다. root맵은 (자식,부모) 키밸류값으로 상속관계를 확인하는 용도입니다.

 

total맵은 (판매자,총액) 키밸류값으로 본인의 수익을 추가 및 확인하는 용도입니다. 

 

9~17 라인에서  root의 상속관계와 total의 총액을 0으로 설정합니다.

 

19~33 라인은  매번 변하는 kid,parent,money의 초기값을 설정합니다.

그리고, money의 총액-수익/10을 본인이 받고, 수익의 10프로를 부모로 올립니다.

(여기서 잠깐, (money/10)*9나 money*0.9하면 틀립니다.)

 

그리고, 참가자가 참여한순대로 answer배열에 출력하면 끝입니다.

 

참고로, 테스트 11~13은 (수익이 1원 미만이 되면 본인이 전부가집니다.)의 규칙을 지키지않으면 틀립니다.

문제가 너무길어서 놓치기 쉬운 실수입니다.

26번의 money==0일때도 꼭 break하여서 시간초과 하지않으셔야합니다.

반응형