몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 3] 다단계 칫솔 판매 {언어 : Python} [다시 풀어 보기] 본문

알고리즘/다시 풀어 보기

프로그래머스 [Lv. 3] 다단계 칫솔 판매 {언어 : Python} [다시 풀어 보기]

스위태니 2024. 7. 3. 01:42

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

def solution(enroll, referral, seller, amount):
    lenE = len(enroll)
    answer = [0 for _ in range(lenE)]
    
    erDict = dict()
    erDict["-"] = -1  # 센터는 인덱스 -1로 표시
    for i in range(lenE):
        erDict[enroll[i]] = i
        
    parents = [-1 for _ in range(lenE)]
    for i in range(lenE):
        if referral[i] != "-":
            parents[i] = erDict[referral[i]]
    
    for i in range(len(seller)):
        current = erDict[seller[i]]
        money = amount[i] * 100
        
        while current != -1:
            keep = money - money // 10
            answer[current] += keep
            money //= 10
            current = parents[current]
            if money < 1:
                break
    
    return answer

풀이 방법

  1. 해당 이름의 위치를 erDict에 저장한다.
  2. 현재 위치의 부모 위치를 node형식으로 저장한다.
  3. 판매자부터 거슬러 올라간다.
    1. 돈을 남겨가면서 올라간다.
    2. 1보다 작을 경우 상납할 돈이 없으므로 종료한다.
  4. answer[i]에 더해진 값들이 상납된 금액의 합이다.

느낀점

  • 잘 풀긴 했는데 마무리가 안좋아서 다시 풀어보는 것이 좋을 것 같다.