[프로그래머스] level3 : 다단계 칫솔 판매 - python

SUN·2022년 9월 23일
0

algorithm

목록 보기
18/30

문제

이번에 풀 문제는 다단계 칫솔 판매이다.

풀이 과정

문제가 엄청 길어서 어려울 줄 알았는데 그냥 풀라는대로 푸니까 풀렸다.
풀이 시간은 50분~한시간 정도 걸린 것 같다ㅠ 왜이렇게 오래걸리지?

  1. 이름 별로 수익을 저장할 배열 income을 초기화 한다.
  2. 각 판매원 별로 다단계 조직에 참여시킨 부모 판매원 이름을 저장하는 dict를 만든다(info)
  3. 각 셀러와 수익에 대해서 아래를 반복한다.
    1. 셀러부터 시작해서 현재 수익에서 10%를 뺀 값을 현재 판매원의 수익에 더한다
    2. 현재 판매원을 부모 판매원으로 변경하고 현재 수익의 10% 값을 현재 수익으로 변경한다.
  4. 나온 수익들을 순서대로 출력한다.

최종 코드

def solution(enroll, referral, sellers, amounts):
    answer = []
	
    # enroll에 있는 값들을 key로 하고 각 value를 0으로 하는 수익을 저장할 dict
    income = dict.fromkeys(enroll, 0)
	
    # info[어떤 판매원] = 부모 판매원(이 판매원을 다단계로 끌어들인 사람)으로 저장
    info = {}
	
    for node, parent in zip(enroll, referral):
        info[node] = parent

    for seller, amount in zip(sellers, amounts):
		
        # 현재 판매원을 셀러로 초기화
        curr_node = seller
        
        # 초기 수익 계산
        curr_amount = amount * 100

        while True:
        	# 부모 판매원이 없으면 끝냄
            if curr_node == "-":
                break
			
            # 부모 판매원 누군 지 찾기
            parent_node = info[curr_node]
            
            # 부모 판매원이 가져갈 수익을 계산하기 위해서 현재 수익에서 10퍼센트 뗌
            parent_amount = curr_amount // 10
			
            # 10% 뗀 값이 1원 이하면 현재 판매원한테 다 주고 그만함
            if parent_amount < 1:
                income[curr_node] += curr_amount
                break
			
            # 현재 수익에서 10% 빼면 현재 판매원의 수익을 결정할 수 있음
            income[curr_node] += curr_amount - parent_amount
			
            # 부모 판매원의 수익을 결정하기 위해서 현재 수익과 현재 판매원 값을 업데이트
            curr_amount = parent_amount
            curr_node = parent_node

    return list(income.values())

주석 없는 코드

def solution(enroll, referral, sellers, amounts):
    answer = []

    income = dict.fromkeys(enroll, 0)

    info = {}

    for node, parent in zip(enroll, referral):
        info[node] = parent

    for seller, amount in zip(sellers, amounts):
        curr_node = seller
        curr_amount = amount * 100

        while True:
            if curr_node == "-":
                break

            parent_node = info[curr_node]
            parent_amount = curr_amount // 10
            if parent_amount <= 0:
                parent_amount = 0

            income[curr_node] += curr_amount - parent_amount

            if parent_amount <= 0:
                break

            curr_amount = parent_amount
            curr_node = parent_node

    return list(income.values())

결과는 통과!

근데 사실

parent_amount = curr_amount // 10

이거 계산할 때

parent_amount = round(curr_amount * 0.1)

으로 계산했어서 한번 틀렸다.
뭐가 잘못된 건지 모르겠어서 힌트를 봐서 위에 처럼 고쳤고 통과를 했다.
사실 힌트를 보고 저렇게 고친 후에도 뭐가.. 문제지? 라고 생각했는데 어떤 분의 블로그를 보고 알게 되었다.

15원의 10%는 1.5원이고 절사하면 1원이다.
그리고 15원에서 90%는 13.5이다. 그리고 이것은 절사하지 않는다.

그러니까 15 0.1 = 1.5 일 때 나는 반올림해서 2원을 넘겨 버리는 격이 돼버린거다.
그래서 curr_amount // 10를 하는 거 외에도 math.floor(curr_amount
0.1)해서 내림을 시켜버려도 된다.

다른 사람의 풀이

거의 똑같아서 생략

참고링크

profile
개발자

0개의 댓글