이번에 풀 문제는 다단계 칫솔 판매이다.
문제가 엄청 길어서 어려울 줄 알았는데 그냥 풀라는대로 푸니까 풀렸다.
풀이 시간은 50분~한시간 정도 걸린 것 같다ㅠ 왜이렇게 오래걸리지?
def solution(enroll, referral, sellers, amounts):
answer = []
# enroll에 있는 값들을 key로 하고 각 value를 0으로 하는 수익을 저장할 dict
income = dict.fromkeys(enroll, 0)
# info[어떤 판매원] = 부모 판매원(이 판매원을 다단계로 끌어들인 사람)으로 저장
info = {}
for node, parent in zip(enroll, referral):
info[node] = parent
for seller, amount in zip(sellers, amounts):
# 현재 판매원을 셀러로 초기화
curr_node = seller
# 초기 수익 계산
curr_amount = amount * 100
while True:
# 부모 판매원이 없으면 끝냄
if curr_node == "-":
break
# 부모 판매원 누군 지 찾기
parent_node = info[curr_node]
# 부모 판매원이 가져갈 수익을 계산하기 위해서 현재 수익에서 10퍼센트 뗌
parent_amount = curr_amount // 10
# 10% 뗀 값이 1원 이하면 현재 판매원한테 다 주고 그만함
if parent_amount < 1:
income[curr_node] += curr_amount
break
# 현재 수익에서 10% 빼면 현재 판매원의 수익을 결정할 수 있음
income[curr_node] += curr_amount - parent_amount
# 부모 판매원의 수익을 결정하기 위해서 현재 수익과 현재 판매원 값을 업데이트
curr_amount = parent_amount
curr_node = parent_node
return list(income.values())
def solution(enroll, referral, sellers, amounts):
answer = []
income = dict.fromkeys(enroll, 0)
info = {}
for node, parent in zip(enroll, referral):
info[node] = parent
for seller, amount in zip(sellers, amounts):
curr_node = seller
curr_amount = amount * 100
while True:
if curr_node == "-":
break
parent_node = info[curr_node]
parent_amount = curr_amount // 10
if parent_amount <= 0:
parent_amount = 0
income[curr_node] += curr_amount - parent_amount
if parent_amount <= 0:
break
curr_amount = parent_amount
curr_node = parent_node
return list(income.values())
결과는 통과!
근데 사실
parent_amount = curr_amount // 10
이거 계산할 때
parent_amount = round(curr_amount * 0.1)
으로 계산했어서 한번 틀렸다.
뭐가 잘못된 건지 모르겠어서 힌트를 봐서 위에 처럼 고쳤고 통과를 했다.
사실 힌트를 보고 저렇게 고친 후에도 뭐가.. 문제지? 라고 생각했는데 어떤 분의 블로그를 보고 알게 되었다.
15원의 10%는 1.5원이고 절사하면 1원이다.
그리고 15원에서 90%는 13.5이다. 그리고 이것은 절사하지 않는다.
그러니까 15 0.1 = 1.5 일 때 나는 반올림해서 2원을 넘겨 버리는 격이 돼버린거다.
그래서 curr_amount // 10를 하는 거 외에도 math.floor(curr_amount 0.1)해서 내림을 시켜버려도 된다.
거의 똑같아서 생략