[문제 링크]
https://programmers.co.kr/learn/courses/30/lessons/77486
[입출력 예]
enroll |
referral |
seller |
amount |
result |
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] |
["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] |
["young", "john", "tod", "emily", "mary"] |
[12, 4, 2, 5, 10] |
[360, 958, 108, 0, 450, 18, 180, 1080] |
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] |
["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] |
["sam", "emily", "jaimie", "edward"] |
[2, 3, 5, 4] |
[0, 110, 378, 180, 270, 450, 0, 0] |
[소스코드]
def solution(enroll, referral, seller, amount):
# 정답 배열 설정
answer = [0]*len(enroll)
idx_list={}
for idx,name in enumerate(enroll):
idx_list[name]=idx #idx_list = {"john":0, ....}
# 이제 인덱스가 있기 때문에 인덱스로 부모 조회가 가능하다.
# 트리를 아예 새로 짜는 게 아니라 부모를 조회하는 방법만 알면 된다.
for idx,name in enumerate(seller):
price=100*amount[idx]
answer[idx_list[name]]+=price #일단 price를 온전히 더함
while referral[idx_list[name]]!="-": #루트 노드 나올때까지
answer[idx_list[name]]-=price//10 # 10%감축,
name=referral[idx_list[name]] # name을 부모의 name으로 바꿈.
answer[idx_list[name]]+=price//10 #부모에게 10%더함
price=price//10 # price를 10%로 재정의
if price==0:
break
answer[idx_list[name]]-=price//10 # 마지막에 price를 90%로 적용시켜줘야함.
return answer