문제
풀이
import sys
input = sys.stdin.readline
n = int(input().rstrip())
d = [[0] * 10 for _ in range(n+1)]
for i in range(1, 10):
d[1][i] = 1
for i in range(2, n+1):
for j in range(10):
if j == 0:
d[i][j] = d[i-1][1]
elif j == 9:
d[i][j] = d[i-1][8]
else:
d[i][j] = d[i-1][j-1] + d[i-1][j+1]
print(sum(d[n]) % 1000000000)
이해하는데 한참 걸렸다. 다른 사람 풀이를 참고했다.
아이디어
⭐️ d[i][j] = d[계단 길이][마지막 숫자]
- 계단의 수가 하나일 때 1 ~ 9로 dp 초기화 해준다.
for i in range(1, 10):
d[1][i] = 1
- 나머지 자릿수의 경우 가장 뒤에 오는 숫자가 0이면 그 앞에 1만 올 수 있다.
if j == 0:
d[i][j] = d[i-1][1]
10 (✅) 01 (❌) <- 0으로 시작하는 수는 계단수가 아니다.
- 가장 뒤에 오는 숫자가 9일 땐, 그 앞에 8만 올 수 있다.
elif j == 9:
d[i][j] = d[i-1][8]
89(✅)
- 나머지 경우는 +1, -1 가능
else:
d[i][j] = d[i-1][j-1] + d[i-1][j+1]
67(-1, ✅), 87(+1, ✅)
마지막엔 각 자릿수(n)의 경우의 수를 모두 합한 후, 문제에서 주어진 1000000000로 나누어 출력한다.
참고
https://wooono.tistory.com/642
'Algorithms > 코테 문풀' 카테고리의 다른 글
[백준 28279번] 덱 2 - Python, 덱 주요 메서드/시간 복잡도 (0) | 2024.04.03 |
---|---|
[백준 1890번] 점프 - Python (1) | 2024.03.28 |
[4963번] 섬의 개수 - Python (0) | 2024.03.19 |
[백준 11725번] 트리의 부모 찾기 🤯 (1) | 2024.03.15 |
[백준 2468번] 안전 영역 - Python (3) | 2024.03.14 |