FrontEnd/프로그래머스

[JS] 다단계 칫솔 판매

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/77486

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제를 해결할 때 꼭 생각해야 하는 점이있다. (내가 실수한 부분이기도 하다)

 

처음에는 판매자의 모든 칫솔 판매량을 한번에 계산한 후 그 판매량의 10%를 부모에게 올라가도록 설계했었다.

 

하지만 위 방식으로는 해결할 수 없다. 

 

1개씩 10번 판매했을 경우와 10개씩 1번 판매했을 경우를 생각해 보자.

 

 

1개씩 10번 -> 100원의 이익이 10번 발생한 것이므로 2번 부모를 거치면 보낼 돈이 0원이 된다.

10개씩 1번 -> 1000원의 이익이 1번 발생한 것이므로 3번 부모를 거치면 보낼 돈이 0원이 된다.

 

 

이점을 생각하고 그래프에 부모,자식 정보를 저장하고 수익이 발생할때마다 부모에게 송금을 시켜주면 된다.

 

 

function solution(enroll, referral, seller, amount) {
    const graph = new Map()
    graph.set('-',{child :[],sell : 0,parent:null})
    
    for (let i = 0 ; i < enroll.length ; i++){
        const enrollName = enroll[i]
        const referralName = referral[i]
        
        graph.set(enrollName,{child :[],sell : 0,parent :referralName})
        graph.get(referralName).child.push(enrollName)
    }
    
    const calculateMoney = (name,money) => {
        const info = graph.get(name)
        
        const sendMoney = ~~(money / 10)
        info.sell += money - sendMoney
        
        if(info.parent && sendMoney!==0) calculateMoney(info.parent,sendMoney)
    }
    
    for (let i = 0 ; i < seller.length ; i++){
        const name = seller[i]
        const profit = amount[i]
        calculateMoney(name,profit * 100)
    }
    
    const ret = []
    for (const [name,info] of graph){
        if (name!=='-') ret.push(info.sell)
    }
    return ret
    
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 카드 짝 맞추기  (1) 2023.12.11
[JS] 모두 0으로 만들기  (0) 2023.12.08
[JS] 110옮기기  (1) 2023.12.06
[JS] 아날로그 시계  (1) 2023.12.03
[JS] 수레 움직이기  (1) 2023.12.01