문제 요약
https://school.programmers.co.kr/learn/courses/30/lessons/77486
enroll은 민호를 제외한 조직 구성원을 담은 배열.referral[i]
은 enroll[i]
의 추천인이다.
seller에 칫솔을 판매한 조직원의 이름, amount[i]
에는 seller[i]
가 판매한 칫솔의 개수가 담겨있다.
이때 각 구성원의 추천인에게 판매한 금액의 10%을 떼어준다.
판매자가 갖게 될 90%가 1원보다 적게 떨어진다면 올림을 해서 가져간다.
추천인의 추천인이 있다면 계속해서 10%를 떼어준다.
enroll에 이름이 포함된 순서에 따라 이익금을 나열해 반환한다.
풀이
refer_set에 각 판매자의 추천인을 딕셔너리로 저장했다.
seller와 amount 정보에 따라 while문을 돌려 각 판매자와 추천인들에게 이익금을 나누어 total에 저장하고,
추천인이 "-"이거나 남은 금액이 0원이라면 while문에서 빠져나오도록 했다.
total 딕셔너리에 enroll 순서대로 이름이 저장되었기 때문에 enumerate를 사용해 answer에 이익금 값만 넣어주었다.
코드
import math
def solution(enroll, referral, seller, amount):
answer = []
total = {name: 0 for idx, name in enumerate(enroll)}
refer_set = {}
for i in range(len(enroll)):
refer_set[enroll[i]] = referral[i]
for i in range(len(seller)):
refer = seller[i]
price = amount[i] * 100
while True:
if refer == "-" or price == 0:
break
take = math.ceil(price * 0.9)
total[refer] += take
price -= take
refer = refer_set[refer]
answer = [total[name] for idx, name in enumerate(total)]
return answer
회고
Level 3 문제였지만 많이 어렵지 않았다.
enumerate를 많이 보긴 했었지만 이번에 처음 사용해봤다.
enumerate
enumerate는 순서가 있는 자료형을 입력으로 받았을 때, 인덱스와 값을 포함해서 리턴해준다.
인덱스와 값을 동시에 접근하면서 루프를 돌리고 싶을 때 사용할 수 있다.
막상 풀 때는 그냥 써보자는 생각으로 사용을 해봤는데, 해당 문제에서는 인덱스값을 쓰지 않아서 굳이 필요가 없었다.
다른 문제에서 인덱스와 값 둘다 필요할 때 사용해 봐야겠다.
'코테 준비' 카테고리의 다른 글
[프로그래머스] 두 큐 합 같게 만들기 (Python) (1) | 2024.03.08 |
---|---|
[프로그래머스] 파괴되지 않은 건물 (0) | 2024.03.07 |
[프로그래머스] 주차 요금 계산 (0) | 2024.03.07 |
[프로그래머스] 둘만의 암호 (Python) (0) | 2024.03.07 |
[백준] 가장 긴 증가하는 부분 수열2 (Python) (0) | 2024.03.02 |