알고리즘 문제풀이

프로그래머스 - 다단계 칫솔 판매

승큐니 2023. 12. 1. 15:30

프로그래머스 - 다단계 칫솔 판매

풀이과정

문제는 길고 복잡하게 느껴졌는데, 특별한 알고리즘은 필요로 하지 않는 문제였다.
먼저 모든 데이터들이 개별 배열로 주어져서 이를 객체로 묶어줬다.

// 판매원 : 판매원을 추천한 사람 을 이어주는 객체
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;
}