풀이과정
문제는 길고 복잡하게 느껴졌는데, 특별한 알고리즘은 필요로 하지 않는 문제였다.
먼저 모든 데이터들이 개별 배열로 주어져서 이를 객체로 묶어줬다.
// 판매원 : 판매원을 추천한 사람 을 이어주는 객체
const recommendation = new Object();
// 각 판매원이 얼마의 이익금을 가져갈지 저장하는 객체
const profit = new Object();
// 주어진 입력값을 통해 recommendation을 채우고,
// profit은 모두 0으로 초기화
for(let i = 0; i < enroll.length; i++){
if(referral[i] !== '-') {
recommendation[enroll[i]] = referral[i];
profit[enroll[i]] = 0;
}
else {
recommendation[enroll[i]] = '';
profit[enroll[i]] = 0;
}
}
그리고 판매원의 매출액을 통해 부모 노드를 찾아 수익을 재귀적으로 배분하는 함수를 구현했다.
function distribute(person, money){
// money가 10보다 작으면 그냥 돈을 갖고 끝냄
if(money < 10) {
profit[person] += money;
return;
}
// distribute가 인자로 받은 person이 적립할 금액
const moneyPersonGet = money - Math.floor(0.1 * money);
profit[person] += moneyPersonGet;
// ''는 트리의 top(민호는 자료에 포함되지 않음)
if(recommendation[person] !== ''){
// 10%의 금액을 추천인에게 배분하기 위해 재귀적으로 함수 호출
distribute(recommendation[person], Math.floor(0.1 * money));
}
}
정답코드
function solution(enroll, referral, seller, amount) {
const recommendation = new Object();
const profit = new Object();
// 멤버 : 멤버 추천인으로 구성된 객체
// 멤버 : 수익금(초기 0) 객체 만들기
for(let i = 0; i < enroll.length; i++){
if(referral[i] !== '-') {
recommendation[enroll[i]] = referral[i];
profit[enroll[i]] = 0;
}
else {
recommendation[enroll[i]] = '';
profit[enroll[i]] = 0;
}
}
// 누군가 판매를 달성했을 때 추천인에게 돈을 적립하고, 추천인의 적립금의 10%를 추천인의 추천인에게도 10%씩 재귀적으로 적립하는 함수
// person과 그가 받는 money를 인자로 함
function distribute(person, money){
// money가 10보다 작으면 그냥 돈을 갖고 끝냄
if(money < 10) {
profit[person] += money;
return;
}
const moneyPersonGet = money - Math.floor(0.1 * money);
profit[person] += moneyPersonGet;
// ''는 트리의 top(민호는 자료에 포함되지 않음)
if(recommendation[person] !== ''){
distribute(recommendation[person], Math.floor(0.1 * money));
}
}
for(let i = 0; i < seller.length; i++){
distribute(seller[i], amount[i]*100);
}
const answer = [];
for(let i = 0; i < enroll.length; i++){
answer.push(profit[enroll[i]])
}
return answer;
}
'알고리즘 문제풀이' 카테고리의 다른 글
프로그래머스 - 연속된 부분 수열의 합 (0) | 2023.12.02 |
---|---|
프로그래머스 - 부대 복귀(Javascript) (0) | 2023.11.29 |
백준 - 1406 에디터 (1) | 2023.11.24 |
백준 - 1912 연속합(Javascript) (1) | 2023.11.21 |
백준 silver 3 - 1463 1로 만들기(Javascript) (0) | 2023.11.20 |