알고리즘

[Algorithm/Java] dev matching : 다단계 칫솔 판매

지수쓰 2021. 7. 31. 04:37
반응형

import java.util.HashMap;
class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        HashMap<String, Integer> list = new HashMap<>();
        int[] recommander = new int[enroll.length];
        int[] answer = new int[enroll.length];

        for(int i=0; i<enroll.length; i++){
            list.put(enroll[i], i);
            answer[i]=0;
        }

       for(int i=0; i<referral.length; i++){

            if(referral[i].equals("-")){
                recommander[i]=-1;
                continue;
            }

            recommander[i]= list.get(referral[i]);
      }

        for(int i=0; i<seller.length; i++){

            int earnMoney = amount[i]*100;
            int distributeMoney =0;
            int currentMember = list.get(seller[i]);

            while(currentMember!=-1){
                distributeMoney = earnMoney / 10;
                earnMoney = earnMoney - distributeMoney;
                answer[currentMember]+= earnMoney;
                currentMember = recommander[currentMember];
                earnMoney = distributeMoney;
                if(earnMoney<1) break;
            }
        }


        return answer;
    }


}

다단계 조직 풀이 문제 풀이 과정

모든 판매원은 칫솔의 판매에 의하여 발생하는 이익의 10%를 계산하여 자신을 조직에 참여시킨 추천인에게 배분하고 나머지는 자신이 가진다.

이익을 얻는 방법

  • 자신이 판매한 이익 90%
  • 자신이 추천한 판매이익10%

주의할 사항

10%를 계산한 금액이 1원 미만인 경우 자신이 가집니다(이득분배X)

파라미터

판매원의 이름을 담은 배열 : enroll

추천인배열 : referral

판매량 집계 데이터

  • 판매원 이름 : seller
  • 판매 수량 : amount

리턴값

판매원이 득한 이익금나열한 배열 ( enroll에 이름이 포함된 순서에 따라 나열 )

제한 사항

enroll의 길이 1이상 10000이하 ( 민호<center> 는 포함되어있지 않다)

referral의 길이 = enroll길이

어느 누구의 추천도 없이 조직에 참여한 사람 ( center의 자식 -> 추천인의 이름이 '-' 이다)

추천인은 이미 enroll에 등장했음이 보장된다

판매량 집계에 해당하는 seller , amount 의 길이는 1이상 100000이하 ( 중복해서 같은 이름이 들어올 수 있다 )

amount 원소 범위(칫솔 개수)는 1이상 100이하

칫솔 한개 판매 이익 : 100원

구성원의 이름 : 10글자 이내 영문 알파벳 소문자


입출력 예
enroll referral seller amount result
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["young", "john", "tod", "emily", "mary"] [12, 4, 2, 5, 10] [360, 958, 108, 0, 450, 18, 180, 1080]
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["sam", "emily", "jaimie", "edward"] [2, 3, 5, 4] [0, 110, 378, 180, 270, 450, 0, 0]
  1. enroll 읽어 hashmap에 name, enroll 배열 index+1로 등록해서 저장
  2. referral 읽어 -면 center 냅두고 다른 string값이면 map에서 조회해서 부모로 등록

위로 올라가는 관계는 필요하지만 아래로 내려가는 관계는 필요하지않기때문에 자식.부모=누구 이거만 저장하면 될듯


 

earnMoney < 1일때 break;해주는점
처음에 break를 return이라고 써서 자꾸 에러가 났다;;

 

 

 


import java.util.*;
class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        
        int N = enroll.length;
        int M = seller.length;
        HashMap<String, ArrayList<String> > childs = new HashMap<>();
        HashMap<String, String> parents = new HashMap<>();
        HashMap<String, Integer> fee = new HashMap<>();
        for(int i=0; i<N; i++) {
            childs.put(enroll[i], new ArrayList<>());
            fee.put(enroll[i], 0);
        }
        fee.put("-",0);
        for(int i=0; i<N; i++){
            parents.put(enroll[i], referral[i]);
        }
        
        for(int i=0; i<M; i++) {
            String now = seller[i];
            int cost = amount[i]*100;
            while(true) {
                if(parents.containsKey(now)==false) break; // 루트
                
                int distribute = cost/10;
                int remain;
                if(distribute==0) {
                    // 1원 미만일 경우
                    remain = cost;
                    fee.put(now, fee.get(now)+remain);
                    break;
                }
                else {
                    remain = cost - distribute;
                    fee.put(now, fee.get(now)+remain);
                    cost = distribute;
                    now = parents.get(now);
                }
            }

        }
        int[] answer = new int[N];
        for(int i=0; i<N; i++){
            answer[i] = fee.get(enroll[i]);
        }
        return answer;
    }
}

ㅓ다시푼코드가 더 느리네..ㅎ 처음꺼처럼 해시값 int배열로 가져와서 푸는거로 해야겠다