PATTERN RECOGNITION

Pyramid Scheme

📌 Source Code: tree/prg2-pyramidscheme.js

function solution(enroll, referral, seller, amount) {
  const sellerMap = new Map();
  const price = 100;
  let result = [];
  for (let member of enroll) {
    sellerMap.set(`${member}`, { income: 0, shared: "" });
  }

  for (let i = 0; i < referral.length; i++) {
    // 자신을 등록한 사람만 기억하면 됨
    if (referral[i] !== "-") {
      const enrolledBy = sellerMap.get(`${enroll[i]}`);

      sellerMap.set(enroll[i], { ...enrolledBy, shared: referral[i] });
      // 자신을 등록한 사람에게 이익금 계산에서 자신의 이익금을 빼서 더해줌.
      console.log(
        `${enroll[i]} \n enrolledBy : ${referral[i]} / ${enroll[i]} data: ${JSON.stringify(sellerMap.get(`${enroll[i]}`))}`,
      );
    }
    // 추가로 추천을 받은 사람 enroll[i]는
  }

  // 여기서 이익 계산함
  for (let i = 0; i < seller.length; i++) {
    const salesman = sellerMap.get(seller[i]);
    if (!salesman) {
      continue;
    }
    console.log(`${i} - salesman : ${seller[i]}`, salesman);
    const refer = salesman.shared;
    const salesCount = amount[i];
    console.log(`${i} - salesCount`, salesCount);
    let fee = 0;

    const income = salesCount * price;
    if (refer) {
      fee = income / 10;
    }
    const netIncome = income - fee;
    console.log(
      `${i} income: ${income}\n fee: ${fee} \nnetIncome >> \n`,
      netIncome,
    );
    sellerMap.set(seller[i], {
      ...salesman,
      income: salesman.income + netIncome,
    });

    if (refer) {
      const referrer = sellerMap.get(refer);
      // fee 더함
      sellerMap.set(refer, { ...referrer, income: referrer.income + fee });
      console.log(`${i} refer ${refer} >> \n`, sellerMap.get(refer));
    }
  }

  // 추가로 첫번째, 두번째 사람들 수수료 뺴줘야됨
  // 자기 이익 전체에서 -10% 해줘야됨
  // 그냥 obj가 쉬울지도.

  // 수수료 빼고, fee 계속 더해서 income 남게 됨.
  console.log("before entries :", sellerMap);
  let sellerArr = [...sellerMap].map(([, obj]) => obj.income);

  return sellerArr;
}

let test1A = [
  "john",
  "mary",
  "edward",
  "sam",
  "emily",
  "jaimie",
  "tod",
  "young",
];
let test1B = ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"];
let test1C = ["young", "john", "tod", "emily", "mary"];
let test1D = [12, 4, 2, 5, 10];

console.log(`result : /n`, solution(test1A, test1B, test1C, test1D));