본문 바로가기
코테 준비

[프로그래머스] 다단계 칫솔 판매 (Python)

by 박수련 2024. 3. 7.

문제 요약

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는 순서가 있는 자료형을 입력으로 받았을 때, 인덱스을 포함해서 리턴해준다.
인덱스와 값을 동시에 접근하면서 루프를 돌리고 싶을 때 사용할 수 있다.
막상 풀 때는 그냥 써보자는 생각으로 사용을 해봤는데, 해당 문제에서는 인덱스값을 쓰지 않아서 굳이 필요가 없었다.
다른 문제에서 인덱스와 값 둘다 필요할 때 사용해 봐야겠다.

 

참고 https://velog.io/@turningtwenty/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-enumerate