Don't give up!

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

Coding Test/Programmers

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

Heang Lee 2021. 5. 23. 12:19

코딩테스트 연습 - 다단계 칫솔 판매 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

다단계 피라미드 구조를 LinkedList의 구현을 통해 만들고, 부모 노드로 이익의 10%를 전달하는 클래스 함수를 만듦으로서 문제를 해결할 수 있습니다.

주어진 입력은 i번째 판매원의 이름과 부모 판매원의 이름 그리고 i번째 판매 데이터에 저장된 판매원 이름과 판매량입니다.

판매원 이름을 Key 값으로 하는 HashMap을 사용하면 더 빠른 시간내에 판매원 객체를 찾을 수 있습니다. 

코드

import java.util.*;
class Solution {
    final int PRICE = 100;
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        HashMap<String, Salesman> map = new HashMap<>();
        Salesman center = new Salesman();
        for(int i=0;i<enroll.length;i++){
            Salesman salesman = new Salesman();
            if(!referral[i].equals("-")){
                salesman.parent = map.get(referral[i]);
            }else{
                salesman.parent = center;
            }
            map.put(enroll[i],salesman);
        }
        for(int i=0;i<seller.length;i++){
            map.get(seller[i]).addProfit(amount[i]*PRICE);
        }
        
        int[] answer = new int[enroll.length];
        for(int i=0;i<enroll.length;i++){
            answer[i] = map.get(enroll[i]).profit;
        }
        return answer;
    }
    class Salesman{
        Salesman parent=null;
        int profit=0;
        public void addProfit(int income){
            int tax = (int) (income*0.1f);
            if(parent!=null && tax>0){
                this.parent.addProfit(tax);    
                this.profit += income-tax;
            }else{
                this.profit += income;
            }
        }
    }
} 

테스트를 통과하는 코드를 작성하였습니다.

클래스 Salesman을 작성하여 이익을 계산할 때 부모 판매원에게 10%의 이익을 줄 수 있도록 하였으며 반환 값은 enroll의 순서대로 Hashmap에서 Salesman 객체를 꺼내 profit의 값을 원소로 저장함으로서 구할 수 있습니다.

 

문제를 해결함에 있어 주의해야할 점은 자신의 이익에게 수입의 0.9를 곱해서 더하면 안된다는 점입니다.

예를 들어 12의 income이 주어질 경우 12x0.1 = 1.2, 12x0.9 = 10.8입니다.

int로의 형변환이 이루어질 때 소수점 미만의 값은 버려지기 때문에 1과 10의 결과값이 계산되어집니다.

따라서 자신의 이익은 수입 - (수입 x 0.1)의 값을 더하여 구해야합니다.