프로그래머스

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

우엥우아앙 2021. 10. 13. 17:13

문제

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

 

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

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

programmers.co.kr

 

문제 접근

key-value로 연결 시켜주어서 비용을 구하는 방식

while 로 돌아갈 경우에 sellerAmount는 10% 한 값이 되어야 한다.

결과 answer 를 도출할 때에는 enroll의 이름 기준으로 정렬되어야 한다.

 

문제 풀이 코드

package D_2021_TopSession;

import java.util.HashMap;
import java.util.Map;

public class S_77486 {

	public static void main(String[] args) {
		
//		String[] enroll = {"john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"};
//		String[] referral = {"-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"};
//		String[] seller = {"young", "john", "tod", "emily", "mary"};
//		int[] amount = {12, 4, 2, 5, 10};

//		"john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"
//		[360, 958, 108, 0, 450, 18, 180, 1080]

		String[] enroll = {"john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"};
		String[] referral = {"-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"};
		String[] seller = {"sam", "emily", "jaimie", "edward"};
		int[] amount = {2, 3, 5, 4};
		
//		"john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"
//		0, 110, 378, 180, 270, 450, 0, 0
				
		int[] result = solution(enroll,referral,seller,amount);
		System.out.print("[");
		for(int rs : result) {
			System.out.print(rs+", ");
		}
		System.out.println("]");
	}
	public static int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];
        
    	Map<String, String> erMap = new HashMap<>();
    	Map<String, Integer> erMoneyMap = new HashMap<>();
    	
        for(int i=0;i<enroll.length;i++) {
        	erMap.put(enroll[i], referral[i]);
        	erMoneyMap.put(enroll[i], 0);
        }
        
        for(int j=0;j<seller.length;j++) {
        	String sellerNm = seller[j];
        	int sellerAmount = amount[j]*100;
        	int sellerAmount10Percent = 0;
        	
        	while(erMap.containsKey(sellerNm)) {
        		sellerAmount10Percent = sellerAmount/10; 
            	erMoneyMap.put(sellerNm, erMoneyMap.get(sellerNm)+(sellerAmount-sellerAmount10Percent));
            	sellerAmount = sellerAmount10Percent;
            	
        		if(sellerAmount<1) {
        			break;
        		}
        		sellerNm = erMap.get(sellerNm);
        	}
        }
        
        for(int k=0;k<enroll.length;k++) {
        	answer[k] = erMoneyMap.get(enroll[k]);
        }
        
        return answer;
    }
}