Coding Problem

[프로그래머스] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) - 다단계 칫솔 판매

Yepchani 2024. 11. 10. 23:32

문제

 

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 문을 사용하였고, 과정은 다음과 같습니다.

  1. 현재 판매자의 수익과 수수료를 계산하고, 수익을 업데이트 합니다.
  2. 현재 판매자의 추천인을 다음 판매자로 설정합니다.
  3. 수수료를 다음 판매 금액으로 설정합니다.

이 과정을 판매 금액이 0이거나 추천인이 없을 때까지 반복합니다.

 

마지막으로 members를 순회하며 이익금을 배열에 저장하고 반환합니다.