본문 바로가기
ps/boj

10844번 Python

by choi-dev 2024. 8. 21.

이 문제는 개인적으로 좀 어려웠는데 이해할 때까지 보면서 대충 감을 잡을 수 있었다.

 

123, 1234 와 같은 1이 인접한 계단의 수를 구하는 것이다. 이게 왜 DP 알고리즘이 적용되지라고 생각했는데 그 이유를 알 수 있었다. 마지막에 4가 온다고 가정해보자. 4에 인접한 수는 3과 5가 있다. 즉, 34와 54를 일단 둘 수 있고 3에서는 2와 4가 인접하다. 그래서 234 434가 될 수 있다.

 

이런 식으로 내려가다보면 결국 4자리 수일 때, 마지막에 있는 숫자 4를 기준으로 3으로 끝나는 계단의 수 + 5로 끝내는 계단의 수를 더하면 4자리의 마지막인 계단의 수를 구할 수 있는 것이다.

 

물론 예외도 있다. 마지막 수가 1이나 9는 인접하는 수가 2와 8밖에 없다. 0으로는 시작할 수 없기 때문이다.

 

# 2자리이고 마지막 자리에 있는 수가 2이면
_2 -> _에 들어가는 수는 1이나 3 = 1자리이고 마지막이 1인 수 + 1자리이고 마지막이 3인 수

# 점화식
d[2][2] = d[1][1] + d[1][3]
d[i][j] = d[i-1][j-1] + d[i-1][j+1]

# 2자리이고 마지막 자리에 있는 수가 0이면
_1 -> _에 들어가는 수는 1

# 점화식
d[2][0] = d[1][1]
d[i][j] = d[i-1][1]

# 2자리이고 마지막 자리에 있는 수가 9면
_9 -> _에 들어가는 수는 8
d[2][9] = d[1][8]
d[i][j] = d[i-1][8]

이렇게 점화식을 구할 수 있고 코드로 구성하면 다음과 같다.

 

import sys

MOD = 1000000000
n = int(sys.stdin.readline())
dp = [[0] * 10 for _ 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] % MOD
        elif j == 9: dp[i][j] = dp[i - 1][8] % MOD
        else: dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j + 1]) % MOD

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

'ps > boj' 카테고리의 다른 글

2193번 Python  (0) 2024.08.22
11057번 Python  (0) 2024.08.22
9095번 Python  (0) 2024.08.20
11727번 Python  (0) 2024.08.19
11726번 Python  (0) 2024.08.18