문제 링크
https://programmers.co.kr/learn/courses/30/lessons/77486
풀이
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) {
div = Math.floor(curAmount / 10);
curMember.profit += curAmount - div;
curAmount = div;
curMember = members.get(curMember.referral);
}
});
return enroll.map(member => members.get(member).profit);
}
모든 회원들의 추천인과 누적 이익을 기록하는 Map 객체를 생성한다.
enroll을 순회하면서 회원들의 추천인(enroll[i]의 추천인은 referral[i]임)을 저장한다.
그 다음, seller를 순회하면서 누적 이익을 저장한다.
먼저 칫솔을 판매한 사람은 판매액의 90%를 누적 이익에 저장하고, 10%를 추천인에게 넘긴다.
이 때, 추천인에게 넘길 10%를 먼저 계산하고 판매한 사람에게는 (판매액 - 추천인에게 넘길 금액)의 이익을 남긴다.
만약 순서를 반대로 하면 틀릴 수 있다.
(ex 판매액이 199원일 때 추천인에게 넘길 10%는 Math.floor(199 / 10) = 19원, 판매한 사람에게는 180원의 이익이 남는다. 하지만, 순서를 반대로하면 Math.floor(199 / 10 * 9) = 179원, 추천인에게 20원의 이익이 남게 된다.)
추천인의 추천인에게도 이익이 계속 전달되어야 한다.
따라서, 반복문을 통해 추천인이 더 이상 없는 다단계 최상위 회원에 이르기까지 반복한다.
이 때, 추천인에게 전달될 이익이 0원이라면 그 이상 반복문을 진행하는 것이 무의미하므로 전달될 금액이 1원 이상일 때에만 반복을 진행하도록 조건을 추가해야 한다. (이 조건을 넣지 않으면 테스트 케이스 11, 12, 13에서 시간 초과가 난다.)
최종적으로 모든 회원의 누적 이익을 members에서 꺼내서 반환하면 된다.
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 거리두기 확인하기 - JavaScript (0) | 2022.05.09 |
---|---|
[프로그래머스 Level 2] 게임 맵 최단거리 - JavaScript (0) | 2022.05.09 |
[프로그래머스 Level 1] [1차] 비밀지도 - JavaScript (0) | 2022.05.06 |
[프로그래머스 Level 1] 신규 아이디 추천 - JavaScript (0) | 2022.04.23 |
[프로그래머스 Level 1] 완주하지 못한 선수 - JavaScript (0) | 2022.04.06 |