[프로그래머스] 다단계 칫솔 판매 / Python / 트리(Tree)

이다혜·2021년 7월 21일
0

다단계 칫솔 판매

문제

각 판매원의 이름을 담은 배열 enroll, 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량을 나열한 배열 amount가 매개변수로 주어질 때, 각 판매원이 득한 이익금을 나열한 배열을 return 하도록 solution 함수를 완성해주세요. 판매원에게 배분된 이익금의 총합을 계산하여(정수형으로), 입력으로 주어진 enroll에 이름이 포함된 순서에 따라 나열하면 됩니다.

(문제가 매우 길어 자세한 요구사항은 여기를 확인하자.)

나의 풀이

딕셔너리에 트리 구조를 저장했다. 모든 구성원을 key로, 각 구성원이 자기 자신을 포함하여 이익금을 분배해야 할 추천인들을 value로 갖게 했다. 문제에서 이익금의 10%를 나눌 때 값을 "버림"한다는 것에 유의하자. 테케는 통과했는데 정확도가 0점이 나와서 매우 당황했다.

import math

def solution(enroll, referral, seller, amount):
    parent = {i:[i] for i in enroll}
    result = {i:0 for i in enroll}
    
    for i, r in enumerate(referral):
        if r != "-":
            parent[enroll[i]] += [r] + parent[r][1:]
            
    '''
    parent =
    {'john': ['john'], 
    'mary': ['mary'], 
    'edward': ['edward', 'mary'], 
    'sam': ['sam', 'edward', 'mary'], 
    'emily': ['emily', 'mary'], 
    'jaimie': ['jaimie', 'mary'], 
    'tod': ['tod', 'jaimie', 'mary'], 
    'young': ['young', 'edward', 'mary']}
    '''
            
    for s, a in zip(seller, amount):
        a = a * 100
        for i in range(len(parent[s])):
            b = math.floor(0.1 * a)
            if b == 0:
                result[parent[s][i]] += a
                break
            else:
                result[parent[s][i]] += a - b
            a = b
                
    return [v for k, v in result.items()]
profile
하루하루 성장중

0개의 댓글