프로그래머스 - 2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 다단계 칫솔 판매
문제
https://programmers.co.kr/learn/courses/30/lessons/77486
정답
재귀 방식으로 해결하려고 했는데 스택 호출 한계에 걸려서 틀리게 된다.
import math
PRICE = 100
tree = {}
def share(person, profit):
current = tree[person]
charge = math.floor(profit * 0.1)
current["profit"] += profit - charge
if current["referer"] == "-":
return
share(current["referer"], charge)
def solution(enroll, referral, seller, amount):
result = []
try:
for person, referer in zip(enroll, referral):
tree[person] = {"referer": referer, "profit": 0}
for person, amount_ in zip(seller, amount):
share(person, amount_ * PRICE)
for person in enroll:
result.append(tree[person]["profit"])
except Exception as exc:
print(exc)
return result
어쩔 수 없이 반복으로 고쳐서 풀이했다. 이때 한가지 실수한게 charge
가 0이면 더이상 반복하지 않아도 되는데 이걸 놓쳐서 시간초과가 났었다 .
import math
PRICE = 100
tree = {}
def share(person, profit):
current = tree[person]
charge = math.floor(profit * 0.1)
current["profit"] += profit - charge
if current["referer"] == "-" or charge == 0:
return
next_referer = [(current["referer"], charge)]
while next_referer:
person, profit = next_referer.pop(0)
current = tree[person]
charge = math.floor(profit * 0.1)
current["profit"] += profit - charge
if current["referer"] == "-" or charge == 0:
return
next_referer.append((current["referer"], charge))
def solution(enroll, referral, seller, amount):
result = []
for person, referer in zip(enroll, referral):
tree[person] = {"referer": referer, "profit": 0}
for person, amount_ in zip(seller, amount):
share(person, amount_ * PRICE)
for person in enroll:
result.append(tree[person]["profit"])
return result