λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/μ•Œκ³ λ¦¬μ¦˜

λ°±μ€€ 9184 파이썬 - μ‹ λ‚˜λŠ” ν•¨μˆ˜ μ‹€ν–‰ - 동적 κ³„νšλ²•

by πŸŒ»β™š 2021. 10. 7.

λ°±μ€€ 9184 파이썬

https://www.acmicpc.net/problem/9184

 

9184번: μ‹ λ‚˜λŠ” ν•¨μˆ˜ μ‹€ν–‰

μž…λ ₯은 μ„Έ μ •μˆ˜ a, b, c둜 이루어져 있으며, ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀. μž…λ ₯의 λ§ˆμ§€λ§‰μ€ -1 -1 -1둜 λ‚˜νƒ€λ‚΄λ©°, μ„Έ μ •μˆ˜κ°€ λͺ¨λ‘ -1인 κ²½μš°λŠ” μž…λ ₯의 λ§ˆμ§€λ§‰μ„ μ œμ™Έν•˜λ©΄ μ—†λ‹€.

www.acmicpc.net

λ¬Έμ œμ—μ„œ μœ„μ™€ 같은 쑰건의 μž¬κ·€ν•¨μˆ˜κ°€ μ£Όμ–΄μ§€λŠ”λ°... ν•΄λ‹Ή μž¬κ·€λ₯Ό κ·ΈλŒ€λ‘œ μ‹€ν–‰ν•˜λ©΄ 값을 κ΅¬ν•˜λŠ”λ° λ„ˆλ¬΄ 였래 κ±Έλ¦°λ‹€κ³  ν•œλ‹€. 동적 κ³„νšλ²•μ˜ 기원? 동적 κ³„νšλ²•μ΄λž€ μ•Œκ³ λ¦¬μ¦˜μ΄ μƒκ²¨λ‚˜κ²Œ 된 배경이... λΆ„ν• μ •λ³΅μ—μ„œ μž‘μ—…λ“€μ„ μͺΌκ°œμ„œ ν•  λ•Œ μ€‘λ³΅λ˜μ„œ ν•˜λŠ” μž‘μ—…μ΄ λ§Žμ€ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘Œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

κ·Έλž˜μ„œ μž¬κ·€ν•¨μˆ˜μ™€ 같이 뎁슀λ₯Ό 타고 λ‚΄λ €κ°€μ„œ 값을 ꡬ할 λ•Œ... κ³„μ‚°ν•œ 값을 쀑간에 ν™•μΈν•˜λŠ” λΆ„κΈ°λ₯Ό μ£Όλ©΄, λΆˆν•„μš”ν•œ 계산을 쀄이고 이전에 κ³„μ‚°ν•œ 값을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

Python 풀이

import sys
read = sys.stdin.readline

cache = {}

def w(a, b, c):
    if a <= 0 or b <= 0 or c <= 0:
        return 1
    if a > 20 or b > 20 or c > 20:
        return w(20, 20, 20)
        
    key = '{} {} {}'.format(a, b, c)
    
    ### ν•΅μ‹¬μ½”λ“œ ###
    if key in cache:
        return cache[key]
    res = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
    cache[key] = res
    ################
    
    return res

while True:
    a,b,c = map(int, read().split())
    if a == -1 and b == -1 and c == -1:
        break
    print('w({}, {}, {}) = {}'.format(a, b, c, w(a, b, c)))
  • 주어진 w ν•¨μˆ˜μ—μ„œ 쀑간에 κ³„μ‚°λœ 값을 μ €μž₯ν•˜κ³  μž¬μ‚¬μš©ν•  수 μžˆλŠ” λΆ„κΈ°λ₯Ό μ€€λ‹€.(핡심 μ½”λ“œ)
  • 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ cacheλ₯Ό λ”•μ…”λ„ˆλ¦¬ ν˜•νƒœλ‘œ μ„ μ–Έν•˜κ³  a,b,cλ₯Ό μ΄μš©ν•΄μ„œ string ν˜•νƒœλ‘œ λ§Œλ“€μ–΄ keyκ°’μœΌλ‘œ μ‚¬μš©ν•œλ‹€.
    • λ‹€λ₯Έ ν’€μ΄λ‘œλŠ” λ”•μ…”λ„ˆλ¦¬κ°€ μ•„λ‹ˆλΌ λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ 3차원 배열을 μ΄μš©ν•΄μ„œ ν‘ΈλŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€. 

λŒ“κΈ€