[python] Kakao2021 - 다단계 칫솔 판매

[python] Kakao2021 - 다단계 칫솔 판매

문제 링크

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

문제 풀이

1. 처음에는 아래와 같이 노드 클래스를 정의하려고 했다. 하지만 이름을 딕셔너리의 키로 사용하고 싶어서 중첩 딕셔너리로 변경했다.

# old class Node(): def __init__(self, name, referral): self.name = name self.referral = referral self.money = 0 nodes = [] for i in range(len(enroll)): nodes.append(Node(enroll[i], referral[i])) # new nodes = {} for i in range(len(enroll)): nodes[enroll[i]] = {"referral": referral[i], "money": 0}

2. seller를 순회하면서 돈을 계산한다. 추천인을 타고 들어가면서 center 바로 밑 사람까지 탐색한다.

2-1. 돈 90%를 챙긴다. math 모듈의 ceil 함수를 이용해 챙기는 돈을 올림 처리한다.

2-2. ptr을 referral로 갱신한다.

2-3. 돈이 0이 되거나, ptr이 center 바로 밑 사람을 가리키면 루프를 종료한다.

3. nodes를 순회하면서 answer를 계산한다.

import math def solution(enroll, referral, seller, amount): nodes = {} for i in range(len(enroll)): nodes[enroll[i]] = {"referral": referral[i], "money": 0} ptr = "" for i in range(len(seller)): ptr = seller[i] money = amount[i] * 100 while True: nodes[ptr]["money"] += int(math.ceil(money * 0.9)) money = int(math.floor(money * 0.1)) if money == 0: break ptr = nodes[ptr]["referral"] if ptr == "-": break answer = [] for e in enroll: answer.append(nodes[e]["money"]) return answer if __name__ == "__main__": print(solution(["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"], \ ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"], \ ["young", "john", "tod", "emily", "mary"], \ [12, 4, 2, 5, 10])) # [360, 958, 108, 0, 450, 18, 180, 1080] print(solution(["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"], \ ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"], \ ["sam", "emily", "jaimie", "edward"], \ [2, 3, 5, 4])) # [0, 110, 378, 180, 270, 450, 0, 0]

from http://johnxpark.tistory.com/31 by ccl(A) rewrite - 2021-08-20 22:00:32