본문 바로가기

프로그래머스 퀴즈(Python)/level 3

23.04.03 파이썬 코딩 퀴즈#208 다단계 칫솔 판매(프로그래머스 스쿨)

이번 문제는 다단계 칫솔 문제이다.

문제 설명이 굉장히 길다... 그리고 다단계 라는 단어에서부터 과연 얼마나 깊게 조직이 이루어 졌을지 걱정부터 앞선다.

민호는 Center에 위치하며, 그 아래에 총 8명의 판매 회원이 존재한다.

8명의 회원 중 총 5명의 회원이 판매 이익을 올렸으며, 내역은 위와 같다.

이제 그림을 통해 민호의 이익금을 확인해보자.

먼저 young 은 총액 1200원 중 90%는 자신이 가지게 되고 그중 10% 인 120원을 edward 에게 준다.

edward는 young에게서 전달받은 120원 중 90%는 자신이 가지고 10% 12원을 mary 에게 준다.

mary 는 edward에게 받은 이익금 12원 중 90%는 자신이 가지고 10% 1원을 center 인 민호에게 전달한다.

그리고 모든 과정을 거친 이익금은 위와 같이 나타낸다.

한가지 tod 의 경우에는 200원의 10%인 20원을 jaimie 에게 전달하고, jaimie 는 20원의 10%인 2원을 받지만, 2원의 10%를 Center에 전달할 수 없기 때문에 2원을 다 가지게 된다. (10%가 1원 미만인 경우에는 분배하지 않는다.)

이제 각 사람이 받는 이익금의 총합을 계산(정수형)하여 전달받은 enroll에 이름이 포한된 순서에 따라 나열하여 반환해야 한다.

제한 사항에 따름녀 민호의 이름은 배열에 주어지지 않는다. 따라서 민호의 추천으로 john 과 mary의 referral 항목은 '-'로 기입된다.

즉 enroll 에는 조직에 포함된 사람, referral 에는 각 enroll[i]를 조직에 추천한 사람의 이름이 seller 에는 판매 이익이 있는 사람이며, amount 는 해당 seller 의 제품 판매 갯수( x 100원) 이 전달 된다.

 

이 문제에서 한가지 주의할 점은 합산 금액이 아니라는 점이다.

입출력 예 1번에 mary에게서 알 수 있듯이

mary 를 기준으로 밑에 회원들에게 받는 금액은 12 + 2 + 50 + 900(자신이 직접 판매한 금액) 이다.

이를 합산하여 10%를 민호에세 분배하는 것이 아닌, 각 분배 금액의 10%를 계산하여 이를 민호에게 분배한다.

그리고 만약 sam의 판매액이 존재한다면, sam의 판매액의 10를 edward 가 받게 되고, 그 금액의 10%를 mary에게 전달하며, 다시 그 금액의 10%를 계산하여 민호에게 분배한다. 절대 합산으로 계산하면 안된다.

 

코드는 생각보다 단순하다. 트리를 탐색할 이유도 없고, 그냥 각 판매 케이스별로 금액을 계산하여 해당 index 에 맞춰서 넣어주면 된다.

그리고 넣어준 금액은 다시 전달하는 금액과 추천인으로 변경하여 현재 판매인이 '-' 이 되는 순간까지 while문을 반복하면 된다.

처음에는 각 회원별로 추천인을 다 연결해 주느라 시간초과에 걸렸었다. 하지만 문제의 조건을 생각해보면 굉장히 어리석은 접근법 이였다.

referral[i] 는 enroll[i[의 추천인이 되므로, 굳이 따로 dict를 만들어줄 필요가 없었다.

각 회원의 회원 번호를 부여하고 부여된 번호를 다시 referral[idx]로 활용하면 되는 문제였다.