새소식

반응형
코딩 테스트

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

  • -
728x90
반응형

문제

  • 한 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배된다.
    • 판매에 의해 발생하는 이익에서 10%를 계산해 자신을 조직에 참여시킨 추천인에게 배분한다.
    • 모든 판매원은 자신이 칫솔 판매에서 발생한 이익과 자신이 조직에 추천해 가입시킨 판매원에게서 발생한 이익의 10% 까지 자신의 이익이 된다.
    • 단, 10%를 계산할 때는 원 단위에서 절사하고 10%를 계산한 금액이 1원 미만인 경우 이득을 분배하지 않는다.
  • 모든 판매원의 칫솔 판매이익금이 주어질 때, 각 판매원이 득한 이익금을 계산해 리턴하기
    • 1 <= 판매원 수 <= 10,000

 

풀이

  • 트리 구조로 나타낼 때, 리프 노드에서 시작해 자신의 이익금을 부모에게 전달해야 한다.
  • 이 과정에서 전체 판매원의 수가 최대 만 명이고 일렬로 늘어져 있다면, $O(N^2)$ 시간이 걸린다.
    -> 아마도 이런 테스트 케이스는 없을 것 같다.
  • 부모에게 이익금 전달할 때, 부모가 없거나 더이상 이익금을 나눌 수 없는 경우 stop.

 

from collections import defaultdict

# 부모에게 이익금 전달하기
def calc(me, money, answer, tree) :
        if me == '-' :  # 더이상 부모가 없는 경우 stop
            return
        
        if money < 10 : # 더이상 이익금을 나눌 수 없는 경우 stop
            answer[me] += money
        else :          
            # 이익금의 90%는 내가 가지고,
            answer[me] += money - int(money * 0.1)  
            # 10%는 부모에게 전달하기
            calc(tree[me], int(money * 0.1), answer, tree)
            
def solution(enroll, referral, seller, amount):
    answer = dict()     # 사람별 수익금
    tree = dict()       # tree[me] = parent
    for me, parent in zip(enroll, referral):
        tree[me] = parent
        answer[me] = 0
    
    for me, money in zip(seller, amount) :
        calc(me, money * 100, answer, tree)
    
    return [ answer[name] for name in enroll ]

 

References

  • 프로그래머스 Lv3 다단계 칫솔 판매
반응형

'코딩 테스트' 카테고리의 다른 글

[프로그래머스] N으로 표현  (0) 2023.06.09
[프로그래머스] 큰 수 만들기  (1) 2023.06.08
[프로그래머스] 110 옮기기  (0) 2023.06.05
[프로그래머스] 표편집  (0) 2023.06.05
[프로그래머스] 체육복  (0) 2023.06.04
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.