[JS/Programmers] 77486. 다단계 칫솔 판매

정나린·2023년 3월 24일
1
post-thumbnail

💬 문제

문제 난이도: Programmers Lv.3

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/77486

❗️접근방법

dfs

👆 코드

function dfs(map, me, total){
    if (me === '-') return;
    const mine = total - ((total*0.1)>>0);
    map[me][1] += mine;
    if (total - mine > 0)
        dfs(map, map[me][0], total-mine);
}

function solution(enroll, referral, seller, amount) {
    const map = {}; 
    for (let i = 0; i < enroll.length; i+=1){ 
        map[enroll[i]] = [referral[i], 0];
        // key: 본인, value: 자신의 부모
    }
    for (let i = 0; i < seller.length; i+=1){
        const name = seller[i];
        const money = amount[i] * 100;
        dfs(map, name, money);
    }
    const result = [];
    for (const key of Object.keys(map)){
        result.push(map[key][1]);
    }
    return result;
}

구현 방법
객체(map)는 본인의 이름을 키로 갖고, [부모의 이름, 본인이 번 금액]을 값으로 갖는다.
enroll 배열을 순회하며 map 객체를 초기화한다.
seller 배열을 순회하며 원소 값을 시작으로 루트 노드방향으로 재귀적으로 호출하는 dfs 함수를 호출한다.
이때 문제의 조건대로 번 돈의 90%는 본인의 이름에 매핑되어 있는 1차원 배열의 1번 인덱스(본인이 번 금액)에 넣고 10%를 다시 dfs 함수의 인자로 넣어 호출한다.
그리고 문제의 조건대로 부모에게 넘겨줄 금액이 0 미만일 때는 재귀호출을 하지 않는다.

0개의 댓글