본문 바로가기
코테/프로그래머스

[프로그래머스/JavaScript] Lv3. 다단계 칫솔 판매

by 검소한달걀 2024. 11. 13.
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

내 코드 (시간 초과)

 

function solution(enroll, referral, seller, amount) {
    const list = enroll.reduce((acc, cur) => {
        acc[cur] = 0;
        return acc;
    }, {});
    
    seller.forEach((name, idx) => {
        let ref = name;
        let benefit = amount[idx] * 10; 
        
        list[ref] += amount[idx] * 100 - benefit;
        
        while(referral[enroll.indexOf(ref)] !== '-' && benefit > 0){
            ref = referral[enroll.indexOf(ref)];
            list[ref] += benefit - Math.floor(benefit / 10); 
            benefit = Math.floor(benefit / 10);
        }
    })
    
    return Object.values(list);
}

 

테스트 케이스

 

1. 각 사람의 이익 초기화

 

2. 셀러 young - 12 (1,200원 이익)이면,

 

그 추천인들인 edward, mary, center 순서대로 이익을 분배해야 한다. 즉,

 

2-0. 첫 셀러 young은 amount[idx] * 100 - benefit = 1200 - 120 = 1080

2-1. enroll에서 해당 셀러의 인덱스를 찾는다. = 7

2-2.  추천인 배열에서 해당 인덱스의 값을 찾는다. = edward

2-3. 해당 사람에게 보유 금액 + benefit - Math.floor(benefit / 10)을 해준다. = 120 - 12 = 108

2-4. 이후 이익금은 Math.floor(benefit / 10) = 120 / 10 = 12

이 과정을 추천인 배열 값이 '-'가 아니고 이익금이 0보다 클 때까지 반복한다.

 

이렇게 했더니 마지막 테스트케이스 10-13에서 시간 초과가 났다.

 

 

코드 수정

 

function solution(enroll, referral, seller, amount) {
    const list = enroll.reduce((acc, cur) => {
        acc[cur] = 0; // 각 사람의 이익 초기화
        return acc;
    }, {});
    
    // 추천인 정보 
    const referralList = enroll.reduce((acc, cur, idx) => {
        acc[cur] = referral[idx];
        return acc;
    }, {});

    seller.forEach((name, idx) => {
        let ref = name;
        let money = amount[idx] * 100; 
        
        while(ref !== '-' && money > 0){
            benefit = Math.floor(money / 10);
            list[ref] += money - benefit;
            
            ref = referralList[ref];
            money = benefit
        }
    })
    
    return Object.values(list);
}

 

1. 각 사람에 대한 추천인도 referralLis 객체로 만들어준다. 

 

이전 코드에서 ref = referral[enroll.indexOf(ref)]로 찾았던 방식 대신

referralLis 객체에서 바로 찾는다.

 

2. 그리고 이전에는 첫 이익금 이후 10%의 이익 benefit을 기준으로 계산했는데

    처음 이익금 amount[idx] * 100 = money를 기준으로 이후 이익금을 계산하고

    while문 안에서 처음부터 처리하도록 했다.