[programmers/js] 다단계 칫솔 판매

승민·2025년 1월 9일

알고리즘

목록 보기
132/171

다단계 칫솔 판매

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

문제 설명

민호는 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 다단계 조직을 만들었습니다.

모든 판매원은 칫솔의 판매에 의하여 발생하는 이익에서 10% 를 계산하여 자신을 조직에 참여시킨 추천인에게 배분하고 나머지는 자신이 가집니다. 모든 판매원은 자신이 칫솔 판매에서 발생한 이익 뿐만 아니라, 자신이 조직에 추천하여 가입시킨 판매원에게서 발생하는 이익의 10% 까지 자신에 이익이 됩니다. 자신에게 발생하는 이익 또한 마찬가지의 규칙으로 자신의 추천인에게 분배됩니다. 단, 10% 를 계산할 때에는 원 단위에서 절사하며, 10%를 계산한 금액이 1 원 미만인 경우에는 이득을 분배하지 않고 자신이 모두 가집니다.

각 판매원의 이름을 담은 배열 enroll, 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량을 나열한 배열 amount가 매개변수로 주어질 때, 각 판매원이 득한 이익금을 나열한 배열을 return 하도록 solution 함수를 완성해주세요. 판매원에게 배분된 이익금의 총합을 계산하여(정수형으로), 입력으로 주어진 enroll에 이름이 포함된 순서에 따라 나열하면 됩니다.

풀이

판매원 - 추천인 관계를 부모 자식 관계로 인식시킨 후 값을 계산하면 끝

function solution(enroll, referral, seller, amount) {
    const members = new Map();
    enroll.forEach((member, i) => {
        members.set(member, { referral: referral[i], profit: 0 });
    });
    
    seller.forEach((member, i) => {
        let curAmount = amount[i] * 100;
        let curMember = members.get(member);
        while (curAmount && curMember) {
            let div = Math.floor(curAmount / 10);
            curMember.profit += curAmount - div;
            curAmount = div;
            curMember = members.get(curMember.referral);
       } 
    });
    return enroll.map(member => members.get(member).profit);
}

0개의 댓글