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

λ°±μ€€ 10844 파이썬 - μ‰¬μš΄ 계단 수 - 동적 κ³„νšλ²•

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

λ°±μ€€ 10844 파이썬

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

 

10844번: μ‰¬μš΄ 계단 수

첫째 쀄에 정닡을 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

www.acmicpc.net

이번 λ¬Έμ œλŠ” 계단 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 계단 μˆ˜λŠ” "45656" 처럼 숫자의 자릿수 λ§ˆλ‹€ ν•˜λ‚˜ μ”© 쀄고 λŠ˜μ–΄λ‚˜λŠ” 수λ₯Ό λ§ν•œλ‹€. 0으둜 μ‹œμž‘ν•  수 μ—†μœΌλ©° 90은 계단 μˆ˜κ°€ μ•„λ‹ˆλ‹€. 이런 쑰건으둜 μ•„λž˜μ™€ 같은 κ·œμΉ™μ΄ λ§Œλ“€μ–΄ 진닀.

  • 0 λ‹€μŒμ—λŠ” 1만 올 수 μžˆλ‹€.
  • 9 λ‹€μŒμ—λŠ” 8만 올 수 μžˆλ‹€.
  • λ‚˜λ¨Έμ§€ μˆ«μžμ— λŒ€ν•΄μ„œλŠ” μ•žλ’€ λͺ¨λ‘ 올 수 μžˆλ‹€.

동적 κ³„νšλ²•μœΌλ‘œ 숫자의 길이에 따라 λ§Œλ“€ 수 μžˆλŠ” 숫자의 갯수λ₯Ό μ €μž₯ν•˜λŠ”λ°... 각 숫자의 끝자리λ₯Ό κΈ°μ€€μœΌλ‘œ κΈ°μ–΅ν•  수 μžˆλŠ” λ©”λͺ¨μ΄μ œμ΄μ…˜ 리슀트λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•œλ‹€.

 

 

Python 풀이

import sys
read = sys.stdin.readline

N = int(read())
cache = [0,1,1,1,1,1,1,1,1,1]

for _ in range(N-1):
    temp = [0] * 10
    for n in range(10):
        if n-1 >= 0:
            temp[n-1] += cache[n]
        if n+1 <= 9:
            temp[n+1] += cache[n]
    cache = temp
print(sum(cache) % 1_000_000_000)
  • μΊμ‹œμ˜ 초기 값은 μˆ«μžκ°€ 1자리일 경우의 값을 λͺ¨λ‘ μž…λ ₯ν•΄μ€€λ‹€.
  • 1자리인 κ²½μš°λŠ” μ •μ˜ν–ˆμœΌλ―€λ‘œ N-1 만큼 for문을 돌리고 μž„μ‹œ 리슀트λ₯Ό λ§Œλ“€μ–΄ λ‹€μŒ 길이의 수λ₯Ό κ΅¬ν•œλ‹€.
    • n-1 >= 0 : n이 1~9
    • n+1 <=9 : n이 0~8
    • n이 0인 경우 λμžλ¦¬κ°€ 1인 숫자의 수λ₯Ό 1번 λ”ν•œλ‹€.
    • n이 9인 경우 λμžλ¦¬κ°€ 8인 숫자의 수λ₯Ό 1번 λ”ν•œλ‹€.
    • κ·Έμ™ΈλŠ” μ•žλ’€μ˜ 수둜 μƒˆλ‘œμš΄ 계단 수λ₯Ό λ§Œλ“€ 수 있기 λ•Œλ¬Έμ— μ•žλ’€ 숫자의 수λ₯Ό 1번 μ”© λ”ν•œλ‹€.
  • 문제의 쑰건에 따라 10^9λ₯Ό λ‚˜λˆ μ„œ 좜λ ₯ν•œλ‹€.

λŒ“κΈ€