이 포스팅은 프로그래머스 시리즈 28 편 중 8 번째 글 입니다.

  • Part 1 - 01: 다리를 지나는 트럭
  • Part 2 - 02: 멀정한 사각형
  • Part 3 - 03: 더 맵게
  • Part 4 - 04: 메뉴 리뉴얼
  • Part 5 - 05: 전화번호 목록
  • Part 6 - 06: 가장 큰 수
  • Part 7 - 07: 예상 대진표
  • Part 8 - This Post
  • Part 9 - 09: 불량 사용자
  • Part 10 - 10: 베스트 앨범
  • Part 11 - 11: 합승 택시 요금
  • Part 12 - 12: 스타 수열
  • Part 13 - 13: 위장
  • Part 14 - 14: 주식 가격
  • Part 15 - 15: 디스크 컨트롤러
  • Part 16 - 16: N으로 표현
  • Part 17 - 17: 전화번호 목록
  • Part 18 - 18: 단어 변환
  • Part 19 - 19: 여행 경로
  • Part 20 - 20: 프린터
  • Part 21 - 21: 후보키
  • Part 22 - 22: 삼각 달팽이
  • Part 23 - 23: 실패율
  • Part 24 - 24: 입국심사
  • Part 25 - 26: 기둥과 보 설치
  • Part 26 - 27: 광고 삽입
  • Part 27 - 28: 퍼즐 조각 채우기
  • Part 28 - 29: 상호 평가
▼ 목록 보기

목차

▼ 내리기

풀이

정말 미쳐버리겠다. 왜 구현을 못하지. 왜 while문으로 구현을 못하는 걸까. 푸는 방법 다 알아놓고. 미쳐버리겠다. 진짜

Code

import sys
sys.setrecursionlimit(1000000)

def cal(name, price, money, head):
    if name == '-' or price <= 0:
        return
    # 돈계산
    give = int(price*0.1)
    take = price - give
    
    # 돈 넣기
    money[name] += take
    
    # 다음 녀석 계산
    next_name = head[name]
    cal(next_name, give, money, head)
    
def solution(enroll, referral, seller, amount):
    # 이름 : 번돈 해시
    # 이름 : 윗대가리 해시
    
    money = dict([(e, 0) for e in enroll])
    head = dict([(e, r) for e, r in zip(enroll, referral)])
    
    for name, m in zip(seller, amount):
        price = 100 * m
        cal(name, price, money, head)
    
    return list(money.values())

그리고 여기서 price가 0보다 작을 경우 조건을 안 걸어주면 시간초과난다. 런타임 에러가 뜰 경우 재귀 호출의 문제가 있을 수 있고, 재귀를 해제하더라도 시간초과가 난다는 것은 depth가 너무들어갔다는 얘기. 그렇다면 이를 중간에 가지치기 할 수 있다.

Code2

    
def solution(enroll, referral, seller, amount):
    # 이름 : 번돈 해시
    # 이름 : 윗대가리 해시
    
    money = dict([(e, 0) for e in enroll])
    head = dict([(e, r) for e, r in zip(enroll, referral)])
    
    for name, m in zip(seller, amount):
        price = 100 * m
        
        while True:
            if name == "-" or price <= 0:
                break
            next_money = int(price * 0.1)
            money[name] += price - next_money
            
            name = head[name]
            price = next_money
        
        # cal(name, price, money, head)
    
    return list(money.values())

아니 이 간단할걸 왜 1시간동안 붙잡고 있냐고. 괜히 쫄아서 그래. 할 수 있는데 쫄아서. 쫄지마. 왠만한거 다 풀 수 있다.