코딩테스트/프로그래머스

[프로그래머스] 다단계 칫솔 판매 (JAVA)

DevPing9_ 2022. 3. 9. 01:18

 

 

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

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

programmers.co.kr

 

 

 

프로젝트 하느랴, 새로운 스택 쌓으랴 너무 바빠서 코테를 3개월정도 멀리했더니...

이렇게 더러운 코드가 나오는구나... (내일 코테는 통과할 수 있을까...)

 

 

 

# 코드 구현

import java.util.*;

class Solution {
    public static int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount)    {
        int[] result = new int[enroll.length];

        Map<String, String> refMap = new HashMap<>();
        for(int i=0; i<enroll.length;i++){
            refMap.put(enroll[i],referral[i]);
        }

        Map<String, Integer> enrollMap = new HashMap<>();
        for(int i=0;i<enroll.length;i++){
            enrollMap.put(enroll[i],i);
        }


        int cnt=0;
        for(String employee : seller){
            Queue<String> q = new LinkedList<>();

            if(refMap.get(employee).equals("-")){
                result[enrollMap.get(employee)]+= amount[cnt]*100-(int)Math.floor(amount[cnt]*100*0.1);
                cnt++;
                continue;
            }

            int earn = amount[cnt]*100-(int)Math.floor(amount[cnt]*100*0.1);
            result[enrollMap.get(employee)]+= earn;

            int remain =  (int)Math.floor((amount[cnt]*100-earn)*0.1);
            int bonus =  (amount[cnt]*100-earn)-remain;

            result[enrollMap.get(refMap.get(employee))]+= bonus;
            q.add(refMap.get(employee));

            while(!q.isEmpty()){
                String curEmp =q.poll();
                String supEmp = refMap.get(curEmp);
                if(supEmp.equals("-") || curEmp.equals("-")) break;


                if(remain*0.1<1){
                    result[enrollMap.get(supEmp)]+=remain;
                    remain=0;
                    break;
                }else{
                    result[enrollMap.get(supEmp)]+= (remain-(int)Math.floor(remain*0.1));
                    remain*=0.1;
                }
                q.add(supEmp);
            }
            cnt++;
        }

        return result;
    }
}
728x90