본문 바로가기
알고리즘 & PS

[프로그래머스] 다단계 칫솔 (Lv 3)

by 다람이도토리 2024. 11. 15.

 

https://school.programmers.co.kr/learn/courses/30/lessons/77486

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제를 매우 잘 읽어야 한다. (안읽어서 또 틀린 사람 나야나)
한번의 수익이 발생할 때 마다, 자신은 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