ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Programmers 다단계 칫솔 판매
    카테고리 없음 2021. 7. 31. 18:32
    728x90

    1. 문제 링크

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

     

    코딩테스트 연습 - 다단계 칫솔 판매

    민호는 다단계 조직을 이용하여 칫솔을 판매하고 있습니다. 판매원이 칫솔을 판매하면 그 이익이 피라미드 조직을 타고 조금씩 분배되는 형태의 판매망입니다. 어느정도 판매가 이루어진 후,

    programmers.co.kr


    2. 문제 요약

    • 부모 노드에게 10% 수익을 배분하여 판매원들의 이익금을 구하는 문제

    3. 아이디어 정리

    판매자 별 부모에게 칫솔 수익을 나눠준다.

    1. 부모가 있는 경우
      • 부모에게 수익 배분 & 자신의 수익에서 배분한 금액만큼 빼기
      • 내 부모가 부모의 부모에게 수익 배분하기 위해 재귀 호출
    2. 부모가 없는 경우고 센터한테만 수익 배분하고 끝

    4. 문제 풀이

    4-1. 내 풀이

    def solution(enroll, referral, seller, amount):
        """
        칫솔 1개 = 100원
        :param enroll: 각 판매원의 이름을 담은 배열
        :param referral: 각 판매원을 다단계 조직에 참여시킨 다른 판매원의 이름을 담은 배열
        :param seller: 판매량 집계 데이터의 판매원 이름을 나열한 배열
        :param amount: 판매량 집계 데이터의 판매 수량을 나열한 배열
        :return: 이익금
        """
        def set_parent_result(sell, money):
            """
            부모한테 10% 수익 나누기 - 재귀
            """
            if money <= 0:  # 돈이 0원이되면 끝내기
                return
            # 1. 부모가 있는 경우 부모에게 수익 배분 & 자신의 수익에서 배분한 금액만큼 빼기
            if parents[sell] != '-':
                answer[location[parents[sell]]] += int(money / 10)
                answer[location[sell]] -= int(money / 10)
                # 내 부모가 부모의 부모에게 수익 배분하기 위해 재귀 호출
                return set_parent_result(parents[sell], int(money / 10))
            else:
                # 2. 부모가 없는 경우고 센터한테만 수익 배분하고 끝 
                answer[location[sell]] -= int(money / 10)
                return
    
        answer = [0] * len(enroll)
        parents = dict()   # 자신의 부모
        location = dict()  # 자신의 위치
        # 자신의 부모와 자신의 위치를 입력
        for i, (en, refer) in enumerate(zip(enroll, referral)):
            parents[en] = refer
            location[en] = i
        # 판매자 별 부모에게 칫솔 수익 나눠주기
        for sell, count in zip(seller, amount):
            answer[location[sell]] += count * 100 # 칫솔 수익 추가
            set_parent_result(sell, count * 100)  # 부모한테 10% 떼어주기
        return answer

     


    5. 결론

    • 재귀를 이용하여 부모에게 배분하는 함수만 짜면 쉬웠던 문제이다.

    댓글

Designed by Tistory.