본문 바로가기

알고리즘/프로그래머스

[프로그래머스] 2021 dev-matching 다단계 칫솔 판매 [JAVA]

문제링크 : programmers.co.kr/learn/courses/30/lessons/77486

 

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

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

programmers.co.kr

(전처리)

enroll 순서대로 해당 이름을 1~N까지 고유 번호를 HashMap에 저장했다.

또, referral 배열 정보로 해당 유저의 부모의 번호를 par 배열에 저장했다.

 

seller 정보와 amount를 가지고 최초 이득 유저와 돈을 가지고서 다단계 과정을 수행했다.

while문이 그것이며, 해당 코인을 본인에게 더하고 부모에게 넘겨주는 식이다. 

부모 정보는 par에 있으므로 par가 없을 때까지 반복한다.

import java.util.*;
class Solution {
    public static int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];
        int [] par = new int[enroll.length+1];
        HashMap key  = new HashMap<String,Integer>();
        int idx = 1;
        for(int i=0;i<enroll.length;i++){
        	key.put(enroll[i], idx++);
        }
        
        for(int i=1;i<=referral.length;i++){
        	String parName = referral[i-1];
        	if(parName.equals("-")){
        		par[i] = 0;
        	}else{
        		par[i] = (int)key.get(parName);
        	}
        }
        for(int i=0;i<seller.length;i++){
        	String name = seller[i];
        	int num = (int)key.get(name);
        	int coin = amount[i]* 100;
        	while(true){
        		if(num==0){
        			break;
        		}
        		
        		answer[num-1] += coin - (int)(coin*0.1);
        		coin *= 0.1;
        		num = par[num];
        	}
        }
        
        return answer;
    }
}