2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 다단계 칫솔 판매 - python3 풀이

Minhee kang·2021년 6월 15일
0

문제 보러 가기👈 클릭!

💡 풀이

문제 파악

  • 칫솔 1개를 팔면 100원을 버는 다단계 조직이 있음. 이때, 자기가 버는 돈을 다 가지는게 아니라 다단계 조직에서 윗사람한테 10%을 주고 나머지 90%를 가짐. 윗사람의 윗사람도 윗사람이 받은 10%의 10%를 받음. 이때 각 조직원들에게 배분 된 이익금 총 합을 return.

  • 각 조직원의 이름을 담은 배열 enroll, 각 조직원을 다단계 조직에 참여시킨 다른 조직원의 이름을 담은 배열 referral, 판매량 집계 데이터의 판매원 이름을 나열한 배열 seller, 판매량 집계 데이터의 판매 수량을 나열한 배열 amount가 매개변수로 주어짐

  • 단, 10%가 1원 미만일 경우 본인이 전부 가짐.

풀이 방법

  • "사람1: 사람1을 다단계에 참여시킨 사람" 의 구조를 갖는 딕셔너리 group 선언
ex) group = {'john': '-', 'mary': '-', 'edward': 'mary', 'sam': 'edward', 'emily': 'mary', 'jaimie': 'mary', 'tod': 'jaimie', 'young': 'edward'}
  • enroll에 있는 이름(구성원들 이름)을 '키'로 이득을 '값' 으로 갖는 딕셔너리 answer 선언 (초기값은 0 으로)
    -> 이득 분배 완료 후, answer의 값(values)들만 return 할 것임
    -> return list(answer.values())
ex) answer = {'john': 360, 'mary': 958, 'edward': 108, 'sam': 0, 'emily': 450, 'jaimie': 18, 'tod': 180, 'young': 1080}
  • '칫솔을 판 사람'부터 시작하여 이 사람들 데려온 윗사람, 또 그 윗사람..으로 더 이상 윗사람이 없을때까지 올라가며 이득을 각각 분배함.

  • 이득은 정수이어야 하기 때문에 10%을 구할 때, 0.1을 곱하는 방법 말고, 10으로 나눈 몫을 구하는 방법을 사용함.

💡 전체 소스 코드

def solution(enroll, referral, seller, amount):
    answer = dict()   #이름 : 분배 후 이익 (초기값은 0)
    group = dict()    #이름 : 참여시킨 다른 사람 이름
    
    for i in range(len(enroll)):
        answer[enroll[i]] = 0
        group[enroll[i]] = referral[i]
    
    for i in range(len(seller)):
        name = seller[i]
        income = amount[i]*100  #분배 전 수익
        while name != '-':
            if income // 10 < 1:
                answer[name] += income
                break
            else:
                answer[name] += income - (income // 10) 
                name = group[name]  #윗 사람 
                income //= 10   #윗 사람이 받는 이득
                
    return list(answer.values())

0개의 댓글

관련 채용 정보