본문 바로가기

프로그래머스

다단계 칫솔 판매

다단계 판매 조직에서는 수익이 판매자뿐만 아니라 추천인에게도 분배됩니다. 이렇게 분배되는 구조를 코딩으로 해결하는 것은 꽤 흥미로운 문제입니다. 이번 포스팅에서는 Python으로 간단히 다단계 수익 분배 알고리즘을 구현하는 방법을 살펴보겠습니다.

문제 설명

  1. enroll: 각 판매자의 이름 목록입니다.
  2. referral: 각 판매자가 가입 시 추천한 추천인의 이름 목록입니다. 추천인이 없는 경우 '-'로 표시됩니다.
  3. seller: 이번에 판매를 발생시킨 판매자 이름 목록입니다.
  4. amount: seller와 일대일로 매칭되는 판매량 목록입니다.

판매자의 수익에서 10%는 상위 추천인에게 전달되고, 90%만 자신에게 남습니다. 추천인이 계속 연결된 경우, 10%를 상위 추천인에게 전달하는 것을 반복합니다.

 

아래 코드는 이 문제를 해결하기 위한 Python 코드입니다.

from collections import defaultdict

def solution(enroll, referral, seller, amount):
    # 판매자의 추천인을 딕셔너리로 저장
    referral_dict = {enr: ref for enr, ref in zip(enroll, referral)}
    # 판매자의 수익을 저장하는 딕셔너리
    seller_dict = defaultdict(int)

    # 수익을 분배하는 재귀 함수
    def distribute_profit(seller, profit):
        if seller == '-' or profit < 1:  # 추천인이 없거나 이익이 1 미만일 때 중지
            return 
        seller_dict[seller] += profit - profit // 10  # 자신의 몫 저장
        distribute_profit(referral_dict[seller], profit // 10)  # 상위 추천인에게 10% 전달
    
    # 각 판매자와 판매량을 기반으로 수익 분배 시작
    for s, a in zip(seller, amount):
        distribute_profit(s, a * 100)  # 판매량에 100을 곱하여 실제 이익 계산
        
    # 결과를 enroll 순서에 맞춰 반환
    return [seller_dict[i] for i in enroll]

코드 설명

1. 초기 설정

  • referral_dict: 각 판매자와 추천인 관계를 딕셔너리로 저장합니다.
  • seller_dict: 각 판매자의 최종 수익을 저장하는 딕셔너리로, defaultdict(int)를 사용해 초기값을 0으로 설정했습니다.

2. 재귀 함수: distribute_profit

이 함수는 seller의 수익을 계산하여, 상위 추천인에게 10%를 전달하는 과정을 재귀적으로 처리합니다. 판매자에게 전달된 profit에서 10%는 상위 추천인에게 전달되고, 나머지는 판매자 본인의 수익으로 누적됩니다.

재귀 함수의 종료 조건

  • 추천인이 없는 경우 ('-')
  • 전달할 금액이 1 미만인 경우 (정수 처리 시 더 이상 분배할 수 없을 때)

3. 메인 로직

판매자와 판매량 목록을 기반으로 distribute_profit 함수를 호출하여 수익 분배를 시작합니다. 이때 amount에 100을 곱하여 실제 수익 금액으로 변환합니다.

4. 최종 결과 반환

마지막으로, 각 판매자의 이름 순서에 맞춰 seller_dict에서 최종 수익을 추출하여 반환합니다.

'프로그래머스' 카테고리의 다른 글

풍선 터트리기  (1) 2024.11.12
2024 KAKAO WINTER INTERNSHIP 주사위 고르기  (0) 2024.11.07
수식 복원하기  (0) 2024.11.04