이 포스팅은 프로그래머스 시리즈 28 편 중 8 번째 글 입니다.
목차
풀이
정말 미쳐버리겠다. 왜 구현을 못하지. 왜 while문으로 구현을 못하는 걸까. 푸는 방법 다 알아놓고. 미쳐버리겠다. 진짜
Code
import sys
sys.setrecursionlimit(1000000)
def cal(name, price, money, head):
if name == '-' or price <= 0:
return
# 돈계산
give = int(price*0.1)
take = price - give
# 돈 넣기
money[name] += take
# 다음 녀석 계산
next_name = head[name]
cal(next_name, give, money, head)
def solution(enroll, referral, seller, amount):
# 이름 : 번돈 해시
# 이름 : 윗대가리 해시
money = dict([(e, 0) for e in enroll])
head = dict([(e, r) for e, r in zip(enroll, referral)])
for name, m in zip(seller, amount):
price = 100 * m
cal(name, price, money, head)
return list(money.values())
그리고 여기서 price가 0보다 작을 경우 조건을 안 걸어주면 시간초과난다. 런타임 에러가 뜰 경우 재귀 호출의 문제가 있을 수 있고, 재귀를 해제하더라도 시간초과가 난다는 것은 depth가 너무들어갔다는 얘기. 그렇다면 이를 중간에 가지치기 할 수 있다.
Code2
def solution(enroll, referral, seller, amount):
# 이름 : 번돈 해시
# 이름 : 윗대가리 해시
money = dict([(e, 0) for e in enroll])
head = dict([(e, r) for e, r in zip(enroll, referral)])
for name, m in zip(seller, amount):
price = 100 * m
while True:
if name == "-" or price <= 0:
break
next_money = int(price * 0.1)
money[name] += price - next_money
name = head[name]
price = next_money
# cal(name, price, money, head)
return list(money.values())
아니 이 간단할걸 왜 1시간동안 붙잡고 있냐고. 괜히 쫄아서 그래. 할 수 있는데 쫄아서. 쫄지마. 왠만한거 다 풀 수 있다.