관리 메뉴

πŸ’»πŸ’­πŸŽ§πŸŒ

BOJ 10844 : μ‰¬μš΄ 계단 수 (Python) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

BOJ 10844 : μ‰¬μš΄ 계단 수 (Python)

adorableco 2023. 1. 31. 14:40
λ°˜μ‘ν˜•

문제

45656μ΄λž€ 수λ₯Ό 보자.

이 μˆ˜λŠ” μΈμ ‘ν•œ λͺ¨λ“  자리의 차이가 1이닀. 이런 수λ₯Ό 계단 수라고 ν•œλ‹€.

N이 μ£Όμ–΄μ§ˆ λ•Œ, 길이가 N인 계단 μˆ˜κ°€ 총 λͺ‡ 개 μžˆλŠ”μ§€ κ΅¬ν•΄λ³΄μž. 0으둜 μ‹œμž‘ν•˜λŠ” μˆ˜λŠ” κ³„λ‹¨μˆ˜κ°€ μ•„λ‹ˆλ‹€.

 

μž…λ ₯

첫째 쀄에 N이 μ£Όμ–΄μ§„λ‹€. N은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

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

 

풀이

dp[자릿수][μ•žμ— μ˜€λŠ” 숫자] = 경우의 수

 

μžλ¦Ώμˆ˜κ°€ 1일 λ•Œμ—λŠ” μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 1μ—μ„œ 9인 κ²½μš°λŠ” ν•˜λ‚˜λΏμ΄λ―€λ‘œ for문을 μ΄μš©ν•΄ 1을 λ„£μ–΄μ€€λ‹€. (μžλ¦¬μˆ˜κ°€ 1일 λ•Œ μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 0인 κ²½μš°λŠ” μ—†μœΌλ―€λ‘œ κ·ΈλŒ€λ‘œ 0으둜 λ‘”λ‹€.)

 

μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 0 인 κ²½μš°μ—λŠ” κ·Έ 뒀에 1만 올 수 있고,  μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 9인 κ²½μš°μ—λŠ” κ·Έ 뒀에 8만 올 수 μžˆμœΌλ―€λ‘œ μ˜ˆμ™Έλ‘œ μ²˜λ¦¬ν•΄μ„œ ν’€μ–΄μ•Ό ν•œλ‹€.

κ·Έ μ™Έμ—λŠ” μ•žμ— μ˜€λŠ” 숫자λ₯Ό n으둜 두면 κ·Έ λ’€μ—λŠ” n-1 λ˜λŠ” n+1 이 올 수 μžˆλ‹€.

 

μžλ¦Ώμˆ˜κ°€ 5 인 κ²½μš°μ— μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 4인 경우 (ex.dp[5][4]) λ₯Ό μ˜ˆμ‹œλ‘œ λ“€μ–΄ ν…Œμ΄λΈ”μ— λ‚˜νƒ€λ‚΄λ©΄

4        

4 μ˜†μ˜ λ„€ 칸은 dp[4][3] (μžλ¦Ώμˆ˜κ°€ 4일 λ•Œ μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 3인 경우) κ³Ό dp[4][5] (μžλ¦Ώμˆ˜κ°€ 4일 λ•Œ μ•žμ— μ˜€λŠ” μˆ«μžκ°€ 5인 경우) κ°€ 될 수 μžˆμœΌλ―€λ‘œ dp[5][4] = dp[4][3] + dp[4][5] 이닀. 

 

 

μ½”λ“œ

n = int(input())

dp = [[0 for i in range(10)] for j in range(n+1)]

for i in range(1,10):
    dp[1][i] = 1

for i in range(2,n+1):
    for j in range(10):
        if j == 0:
            dp[i][j] = dp[i-1][1]
        elif j == 9:
            dp[i][j] = dp[i-1][j-1]
        else:
            dp[i][j] = dp[i-1][j-1] + dp[i-1][j+1]

print(sum(dp[n])%1000000000)

 

 

λ°˜μ‘ν˜•