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

배인성·2022년 2월 16일
0

프로그래머스

목록 보기
33/55
post-thumbnail

링크

문제 링크

문제 설명 (너무 길어서 그냥 요약함)

다단계 하는 회사가 있는데, 그 회사의 조직 구성도는 이러하다.

이 회사의 수익 구조는 만약 말단 직원인 young이 1200원을 벌었다고 가정하자.

그럼 이런식으로 young은 1200원에서 수수료(10%)를 자신의 추천인(edward)에게 떼준다.

그럼 edward는 자신의 추천인(mary)에게 young에게 받았던 수수료(10%)의 10%를 떼준다.

그래서 판매원의 이름과, 그 사람의 추천인과 판매정보(seller와 그 seller가 얼마나 팔았는지)에 대한 매개변수가 주어지면, 우리는 꼭대기 직원 말고 그 밑의 직원들이 얼마씩 벌었는지에 대해 return해주면 된다.

제한사항

  • enroll의 길이는 1 이상 10,000 이하입니다.
    • enroll에 민호의 이름은 없습니다. 따라서 enroll의 길이는 민호를 제외한 조직 구성원의 총 수입니다.
  • referral의 길이는 enroll의 길이와 같습니다.
    • referral 내에서 i 번째에 있는 이름은 배열 enroll 내에서 i 번째에 있는 판매원을 조직에 참여시킨 사람의 이름입니다.
    • 어느 누구의 추천도 없이 조직에 참여한 사람에 대해서는 referral 배열 내에 추천인의 이름이 기입되지 않고 “-“ 가 기입됩니다. 위 예제에서는 john 과 mary 가 이러한 예에 해당합니다.
    • enroll 에 등장하는 이름은 조직에 참여한 순서에 따릅니다.
    • 즉, 어느 판매원의 이름이 enroll 의 i 번째에 등장한다면, 이 판매원을 조직에 참여시킨 사람의 이름, 즉 referral 의 i 번째 원소는 이미 배열 enroll 의 j 번째 (j < i) 에 등장했음이 보장됩니다.
  • seller의 길이는 1 이상 100,000 이하입니다.
    • seller 내의 i 번째에 있는 이름은 i 번째 판매 집계 데이터가 어느 판매원에 의한 것인지를 나타냅니다.
    • seller 에는 같은 이름이 중복해서 들어있을 수 있습니다.
  • amount의 길이는 seller의 길이와 같습니다.
    • amount 내의 i 번째에 있는 수는 i 번째 판매 집계 데이터의 판매량을 나타냅니다.
    • 판매량의 범위, 즉 amount 의 원소들의 범위는 1 이상 100 이하인 자연수입니다.
  • 칫솔 한 개를 판매하여 얻어지는 이익은 100 원으로 정해져 있습니다.
  • 모든 조직 구성원들의 이름은 10 글자 이내의 영문 알파벳 소문자들로만 이루어져 있습니다.

입출력 예

입출력 예 설명

입출력 예 #1

이건 문제 예신데, 1번의 입출력을 다 하고나면 직원은 이렇게 수익을 분배하게 된다.

입출력 예 #2
문제에 주어진 예시와 동일한 조직 구성에 조금 다른 판매량 집계를 적용한 것입니다. 이익을 분배하는 규칙이 동일하므로, 간단한 계산에 의하여 표에 보인 결과를 얻을 수 있습니다.

풀이

  1. 직원의 수익을 저장할 hashmap(amountmap)과 직원의 추천인(parent)를 저장하는 hashmap(parentmap)을 선언하자.
  2. 칫솔은 개당 100원 고정이니까 amount *= 100을 다 해주자.
  3. 분배로직은 money > 0일때까지 seller[i]를 시작으로 amountmap에 money - money / 10을 put하고, parentmap에서 seller[i]의 부모를 찾고 반복하자
  4. 끝으로 amountmap을 순회하면서 key값을 enroll 배열에서 찾아 그 인덱스를 가지고 getValue()값을 주면 된다.

문제 설명이 너무 길다...

근데 다단계라는 소재가 좋았던 탓인지 풀 때 재밌게 풀었다 ㅋㅋ

컴파일은 한번에 통과!

코드

import java.util.*;
class Solution {
    Map<String, Integer> amountmap = new HashMap<>();
    Map<String, String> parentmap = new HashMap<>();
    public void setting(String[] enroll, String[] referral, String[] seller, int[] amount) {
        for(int i = 0; i < enroll.length; i++) {
            amountmap.put(enroll[i], 0);
        }
        for(int i = 0; i < referral.length; i++) {
            if(referral[i].equals("-")) 
                parentmap.put(enroll[i], "minho");
            else
                parentmap.put(enroll[i], referral[i]);
        }
        for(int i = 0; i < seller.length; i++) {
            amount[i] *= 100;
        }
    }
    public int get_index(String[] enroll, String man) {
        for(int i = 0; i < enroll.length; i++) {
            if(man.equals(enroll[i]))
                return i;
        }
        return 0;
    }
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        int[] answer = new int[enroll.length];
        setting(enroll, referral, seller, amount);
        for(int i = 0; i < seller.length; i++)
        {
            int money = amount[i];
            String slr = seller[i];
            while(money > 0 && !slr.equals("minho"))
            {
                amountmap.put(slr, amountmap.get(slr) + (money - money/10));
                money /= 10;
                slr = parentmap.get(slr);
            }
        }
        List<Map.Entry<String, Integer>> list = new ArrayList<>(amountmap.entrySet());
        for(Map.Entry<String, Integer> entry : list) 
        {
            answer[get_index(enroll, entry.getKey())] = entry.getValue();
        }
        return answer;
    }
}
profile
부지런히 살자!!

0개의 댓글