N
(프로그래머스 JS)다단계 칫솔 판매 본문
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;
}
'프로그래머스 알고리즘 > 3단계' 카테고리의 다른 글
(프로그래머스 JS)야근 지수 (0) | 2022.06.04 |
---|---|
(프로그래머스 C++)다단계 칫솔 판매 (0) | 2022.04.13 |
(프로그래머스 JS)스티커 모으기(2) (0) | 2022.01.07 |
(프로그래머스 JS)기지국 설치 (0) | 2022.01.03 |
(프로그래머스 JS)단어 변환 (0) | 2021.11.29 |