문제
https://school.programmers.co.kr/learn/courses/30/lessons/77486
예시 코드
class Member {
#name;
#referral;
#earning;
constructor(name, referral) {
this.#name = name;
this.#referral = referral;
this.#earning = 0;
}
getName() {
return this.#name;
}
getReferral() {
return this.#referral;
}
getEarning() {
return this.#earning;
}
updateEarning(earning) {
this.#earning += earning;
}
}
function solution(enrolls, referrals, sellers, amounts) {
const result = [];
const CENTER = "-";
const COMMISSION_RATE = 0.1;
const PRICE = 100;
const members = new Map();
for (let i = 0; i < enrolls.length; i++) {
const name = enrolls[i];
const referral = referrals[i];
const member = new Member(name, referral);
members.set(name, member);
}
for (let i = 0; i < sellers.length; i++) {
let seller = sellers[i];
let amount = amounts[i] * PRICE;
while (amount !== 0 && seller !== CENTER) {
const commission = Math.floor(amount * COMMISSION_RATE);
const profit = amount - commission;
const member = members.get(seller);
member.updateEarning(profit);
seller = member.getReferral();
amount = commission;
}
}
for (const [k, v] of members) {
result.push(v.getEarning());
}
return result;
}
풀이
member에 대한 정보를 담은 class Member를 만들어 구조를 명확하게 하고, 재사용을 하고자 했습니다. 내부 속성은 private 필드를 사용하여 외부에서 직접 접근할 수 없도록 했습니다.
member 인스턴스는 Map members에 저장해 각 member의 정보를 쉽게 가져올 수 있도록 했습니다.
판매자 수익을 분배하는 로직은 복잡하지 않아서 while 문을 사용하였고, 과정은 다음과 같습니다.
- 현재 판매자의 수익과 수수료를 계산하고, 수익을 업데이트 합니다.
- 현재 판매자의 추천인을 다음 판매자로 설정합니다.
- 수수료를 다음 판매 금액으로 설정합니다.
이 과정을 판매 금액이 0이거나 추천인이 없을 때까지 반복합니다.
마지막으로 members를 순회하며 이익금을 배열에 저장하고 반환합니다.
'Coding Problem' 카테고리의 다른 글
[프로그래머스] 등굣길 (0) | 2024.11.12 |
---|---|
[프로그래머스] 2019 카카오 개발자 겨울 인턴십 - 징검다리 건너기 (0) | 2024.11.08 |
[프로그래머스] 다음 큰 숫자 (0) | 2024.03.20 |
[프로그래머스] 2022 카카오 테크 인턴십 - 두 큐 합 같게 만들기 (0) | 2024.03.19 |