꾸물꾸물 졔의 개발공부

[프로그래머스] 다단계 칫솔 판매 - JAVA (2021 Dev-Matching: 웹 백엔드 개발자(상반기)) 본문

알고리즘/프로그래머스

[프로그래머스] 다단계 칫솔 판매 - JAVA (2021 Dev-Matching: 웹 백엔드 개발자(상반기))

체제 2023. 6. 27. 20:57

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

알고리즘 

  • 특별한 알고리즘을 사용하지 않고 문제 그대로 구현하면 쉽게 풀 수 있었다 ! 
  • seller의 추천인을 찾거나, answer에 각 판매원별로 득한 이익금을 저장하는 과정에서 배열에 접근하는 인덱스를 관리하기 위해 해시맵에 (이름-인덱스번호) 를 저장하였다.  

 

구현 과정

  • Map<String, Integer> map : enroll[] 에 입력된 순서대로 (이름 - 배열 인덱스 번호 저장) 

 

1. 입력으로 주어진 enroll에 이름이 포함된 순서에 따라 해시맵에 (이름 - 배열 번호) 를 저장한다. 

 

2. 각 판매원(name) , 판매금액(price)에 따라 아래 과정을 반복한다. 

  • reco_name: 판매원의 추천인, map에서 판매원의 인덱스번호를 찾아 referral 배열에서 찾는다.
  • up_price: 추천인에게 배분할 금액, 판매금액의 10%. 단, up_price 가 1 미만일 경우 0으로 간주한다. 
  • (price - up_price) 의 금액(=90%)을 현재 판매원의 이익금 배열 answer에 누적시킨다.
    👉 up_price가 1 미만으로 0일 경우에는 90%가 아닌 전체 금액이 더해진다. 
  • 만약 추천인이 "-" 라면, center 이므로 반복을 종료한다. (center는 이익금 계산할 필요 x) 
  • 다단계 조직의 다음 반복을 위해 name = reco_name , price = up_price 하여 상위 과정을 반복한다. 
  • price 가 0 이하라면, 반복문을 종료한다. 

 

3. answer 배열 리턴 

 


소스 코드

import java.util.*;
class Solution {
    public int[] solution(String[] enroll, String[] referral, String[] seller, int[] amount) {
        Map<String, Integer> map = new HashMap<>(); //이름, 배열 인덱스번호 
        for(int i=0; i<enroll.length; i++){
            map.put(enroll[i], i); 
        }
        
        int[] answer = new int[enroll.length]; 
        for(int i=0; i<seller.length; i++){
            String name= seller[i]; 
            int price = amount[i] * 100; //name이 얻은 수익 
            while(price > 0){
                //name의 추천인 
                String reco_name = referral[map.get(name)]; 
                //추천인에게 넘어갈 금액 
                int up_price = (int)(price * 0.1); 
                if(up_price < 1) up_price =0; 
                
                answer[map.get(name)] += (price-up_price);
                //추천인이 없을경우
                if(reco_name.equals("-")) break; 
                
                name = reco_name; 
                price = up_price; 
            }
        }
     
        return answer;
    }
  
}