Software

(프로그래머스 JS)다단계 칫솔 판매 본문

프로그래머스 알고리즘/3단계

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

favorcom 2022. 3. 23. 10:31
728x90
반응형

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

 

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

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

programmers.co.kr

Map을 이용한 문제 풀이.

 

map = enroll과 referral 배열의 부모-자식 관계를 나타내기 위한 Map.

profit = 각 사람들의 판매 이익을 나타내기 위한 Map.

 

enroll을 순회하면서 부모-자식 관계를 나타내도록 하자.

enroll[i]를 key, referral[i]를 value로 가지도록 하여 map에 저장한다.

 

이후 seller를 순회하면서 판매 이익을 나누도록 한다.

person = seller[i],

val = 현재 person의 부모를 map에서 가져온다.

p = 현재 person의 판매 이익을 profit에서 가져온다.

price = amount[i] * 100 // 칫솔은 100원으로 정해져 있다.

 

우선 현재 person의 판매 이익을 갱신시킨다.

person을 key로, (현재까지의 person의 판매 이익 + 판매 이익에서 10%를 뺀 값)을 value로 가지도록 한다.

 

이후 dfs 함수에 (parent, 판매 이익에서 10%)를 넘겨주면서 다단계 형식으로 판매 이익을 가지도록 한다.

dfs 함수:

parent가 "-" 이거나, remain < 1 이라면 리턴으로 종료한다.

종료 조건이 아니라면 위 단계처럼 똑같이 진행해준다.

 

function solution(enroll, referral, seller, amount) {
    const answer = [];
    const map = new Map();
    const profit = new Map();
    
    const dfs = (parent, remain) => {
        if(parent === "-" || remain < 1){
            return;
        }
        const price = profit.get(parent) || 0;
        const val = map.get(parent);
        
        profit.set(parent, price + remain - Math.floor(remain * 0.1));
        
        dfs(val, Math.floor(remain * 0.1));
    }
    
    for(let i = 0; i < enroll.length; i++){
        const refer = referral[i];
        const enroller = enroll[i];
        
        map.set(enroller, refer);
    }
    
    for(let i = 0; i < seller.length; i++){
        const person = seller[i];
        const val = map.get(person) || [];
        const p = profit.get(person) || 0;
        let price = amount[i] * 100;
        
        profit.set(person, p + price - Math.floor(price * 0.1));
        dfs(val, Math.floor(price * 0.1));
    }
    
    for(let i = 0; i < enroll.length; i++){
        const val = profit.get(enroll[i]) || 0;
        
        answer.push(val);
    }
    
    return answer;
}
728x90
반응형