https://school.programmers.co.kr/learn/courses/30/lessons/77486
문제를 매우 잘 읽어야 한다. (안읽어서 또 틀린 사람 나야나)
한번의 수익이 발생할 때 마다, 자신은 90%를 가지고(원단위 절사 방식) 나머지를 자신의 추천자에게 올린다.
추천자는 그거를 또 바로 올려야 한다. 언제까지? 0이 될 때 까지. 혹은 더 이상 상사가 없을 때 까지.
트리 문제인척 하는 단순 while 문제다. 다만, 저장해두면 도움되니까. 애초에 dict로 만들어주면 데이터 접근이 쉽겠지?
while의 종료 조건은 더 이상 정산 불가인 0원 도달 혹은 상사가 없는 ('-') 사람일 경우다.
다만 상사가 없으면, 나한테 돈은 뜯기고 가야하므로, 돈을 뜯어주는 코드를 잊지 말자.
* 한 번의 수익이 발생할 때 마다 이므로, 모든 수익을 누적하고 그리디하게 풀 생각은 하지 말자. 난 그래서 틀렸다. 100원씩 10번 파는 거와, 1000원을 1번 파는 거는 전혀 다른 결과를 가져오기 때문이다.
# 칫솔은 개당 100원
def solution(enroll, referral, seller, amount):
boss_dict = {}
rev_dict = {}
# 자신의 추천인, 현재 수익을 dict로 만든다.
for i in range(len(enroll)):
cur_name = enroll[i]
boss_dict[cur_name] = referral[i]
rev_dict[cur_name] = 0
# 조직에 가장 늦게 참여한 애부터 그리디하게 올라가면 되나?
# 그렇지 아니함. 이게 각 판매마다 수익 정산을 해야함..
for i in range(len(seller)):
cur_seller = seller[i]
cur_amt = amount[i] * 100
rev_dict[cur_seller] += cur_amt
if boss_dict[cur_seller] == '-':
rev_dict[cur_seller] -= cur_amt // 10
else:
while True:
cur_boss = boss_dict[cur_seller]
cur_give = cur_amt // 10
if cur_give == 0:
break
elif cur_boss == '-':
rev_dict[cur_seller] -= cur_give
break
else:
rev_dict[cur_seller] -= cur_give
rev_dict[cur_boss] += cur_give
cur_amt = cur_give
cur_seller = cur_boss
answer = []
for cur_emp in enroll:
answer.append(rev_dict[cur_emp])
return answer
'알고리즘 & PS' 카테고리의 다른 글
[BOJ] 웜홀 (G3, 1865) - 벨만-포드 알고리즘 튜토리얼 (0) | 2024.11.16 |
---|---|
[BOJ] 플로이드 (G4, 11404) : 플로이드-워셜 vs 다익스트라 (2) | 2024.11.15 |
[프로그래머스] 양궁 대회 (Lv 2) (0) | 2024.11.15 |
[BOJ] 테트리미노 (14500, G4) (0) | 2024.11.12 |
[BOJ] 이중 우선순위 큐 (7662, G4) (0) | 2024.11.12 |