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
return list(money.values())
def solution(enroll, referral, seller, amount):
answer = []
d=dict() #연결 고리 트리
res=dict()
result=dict()
for i in range(len(enroll)):
d[enroll[i]]=referral[i]
res[enroll[i]]=0
result[enroll[i]]=0
def cal(p):
if d[p]!='-': #연결되어있는 사람이 있다는 뜻
person=d[p]
m=int(res[p]*0.1) ##수수료
res[p]-=m
res[person]=m
cal(person)
else:
m=int(res[p]*0.1) ##수수료
res[p]-=m
for i in range(len(enroll)):
result[enroll[i]]+=res[enroll[i]]
res[enroll[i]]=0
for i in range(len(seller)):
if amount[i]==0:
continue
res[seller[i]]=amount[i]*100
cal(seller[i])
for i in result:
answer.append(result[i])
return answer
위와 같은 코드로 작성하니 런타임 에러나 시간 초과 문제가 있었다..
이런 문제를 어떻게 해결할 수 있을지 찾아보며 작성했지만, 해결이 어려워서 다른 사람의 코드를 참고하였다.
런타임 에러가 나는 이유는 재귀에서 depth가 너무 들어가 너무 깊어 생기는 문제라고 볼 수 있다고 한다. price 즉 10퍼센트 씩 줄어드는 (m)값이 0이면 굳이 재귀를 실행할 필요가 없기 때문에 시간 초과 문제를 해결할 수 있다고 했다.
하지만 내 코드에서 그러한 조건을 걸어주니 더 많은 오답이 나왔다..ㅠ
정답 코드는 참고하여 해결하였다.
딕셔너리를 사용해 접근하는 방식은 맞았지만, 재귀를 쓰는 것이 아닌 while문으로 작성한 것을 볼 수 있었다.
해당 코드를 통해 zip()이라는 문법도 다시 돌아볼 수 있었다.
zip() 내장함수
데이터를 엮어주는 함수이다.
zip() 함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환합니다.