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

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

배똥회장 2022. 6. 7. 10:46
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? O
본인의 실력으로 풀었는가? O

 

 

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

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

programmers.co.kr

 

 

 

 

 

import java.util.*;
class Solution {
	//이름에 대한 부모와 자기 포인트 확인용 해시맵
    HashMap<String, Family> map;
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];
        map = new HashMap<>();
        
        //본인에 대한 부모와 포인트 설정
        for (int i = 0; i < enroll.length; i++) {
            Family f = new Family(referral[i], 0);
            map.put(enroll[i], f);
        }
        
        //센터는 따로 enroll에 없기 때문에 따로 추가하기
        map.put("-", new Family("", 0));
        
        for (int i = 0; i < seller.length; i++) {
            int money = amount[i] * 100; //판매금액
            String son = seller[i]; //판매자
            
            //센터까지 올라가야하기 때문에 while문 활용
            while (true) {
            	//부모에게 넘길 돈 현재 금액의 10%
                int parentMoney = (int) (money * 0.1);
                
                //부모에게 주고 남은 돈
                int sonMoney = money - parentMoney;
                
                //남은 돈은 추가하고, 부모 이름 리턴
                son = map.get(son).addPoint(sonMoney);
                
                //부모에게 넘길 돈으로 현재 금액 설정하기
                money = parentMoney;
                
                //만약 부모에게 넘길 돈이 0원이거나 부모가 없는 경우(센터일 경우) while문 탈출
                if (son.equals("") || money == 0) break;
            }
        }
        
        //enroll로 answer에 포인트 값 넣기
        for (int i = 0; i < enroll.length; i++) {
            answer[i] = map.get(enroll[i]).point;
        }
        return answer;
    }
}

class Family {
    String parent;
    int point;
    public Family(String parent, int point) {
        this.parent = parent;
        this.point = point;
    }
    
    public String addPoint(int point) {
        this.point += point;
        return parent;
    }
}

 

테스트 1 통과 (0.28ms, 83.4MB)
테스트 2 통과 (0.42ms, 95.5MB)
테스트 3 통과 (0.33ms, 79.8MB)
테스트 4 통과 (0.41ms, 79.7MB)
테스트 5 통과 (0.84ms, 72.2MB)
테스트 6 통과 (4.60ms, 105MB)
테스트 7 통과 (4.57ms, 103MB)
테스트 8 통과 (6.65ms, 97.5MB)
테스트 9 통과 (17.94ms, 98.1MB)
테스트 10 통과 (38.93ms, 131MB)
테스트 11 통과 (28.77ms, 133MB)
테스트 12 통과 (37.54ms, 130MB)
테스트 13 통과 (18.79ms, 141MB)

 

 

 

 

 

 

728x90