티스토리 뷰

PS

10844. 쉬운 계단 수

tose33 2020. 8. 6. 19:23

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

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

 

인접한 모든 자리의 수가 1 차이 나는 수 가 계단수이다. (예: 45656)

0으로 시작할 수는 없다.

 

d[n][a] : 길이가 n인 계단수중 끝 숫자가 a인 계단수의 총 개수

 

즉 길이가 n인 계단수의 총 개수 

d[n] = d[n][0] + d[n][1] + d[n][2] + ... + d[n][9]

 

n = 1 일때

2

3

4

5

6

7

8

9

 

n = 2 일때

10

21

12, 32

23, 43

34, 54

45, 65

56, 76

67, 87

78, 98

89

 

n = 3일때

210

121, 121, 321

212, 232, 432

123, 323, 343, 543

234, 434, 454, 654

345, 545

456, 656 ...

 

보면 알듯이 계단 사이의 차는 1이면 되기 때문에 내려오는 계단일수도 있고 올라가는 계단 일 수 도 있다.

그래서 d[n][a] = d[n-1][a-1] + d[n-1][a+1]

 

그런데 위에서 보면 맨 뒤 자리가 0일때는 예를들어 10 이면 그후 내려가는 계단이 있을 수 없고 올라가는 계단만 있을 수 있다. 그래서 d[n][0] = d[n-1][1]

// n = 2일때 21(d[n-1][1])이 210(d[n][0])이 됨

 

마찬가지로 맨 뒤 자리가 9이면 예를들어 89 이면 그 후 올라가는 계단이 있을 수 없고 내려가는 계단만 있을 수 있다.

그래서 d[n][9] = d[n-1][8]

 

이 두가지 경우를 예외처리를 해줘야 한다.

d = [[0] * 10 for i in range(101)]

for i in range(10):
    d[0][i] = 0

d[1][0] = 0  # base
for i in range(1, 10, 1):  # 1자리의 개수는 다 1
    d[1][i] = 1


def dp(a, b):
    for i in range(10):
        if b == 0:  # 맨 뒤 자리가 0이면 예외처리
            d[a][b] = d[a-1][1]
        elif b == 9:  # 맨 뒤 자리가 9면 예외처리
            d[a][b] = d[a-1][8]
        else:
            d[a][b] = d[a-1][b-1] + d[a-1][b+1]

        return d[a][b]


n = int(input())  # n : 문자 길이

for i in range(2, n+1, 1):  # 2 부터 n까지
    for j in range(10):
        d[i][j] = dp(i, j)

res = 0
for i in range(10):
    res += d[n][i]

print(res % 1000000000)

 

 

'PS' 카테고리의 다른 글

2156. 포도주 시식  (0) 2020.08.10
11057. 오르막 수  (0) 2020.08.07
11052. 카드 구매하기  (0) 2020.08.06
백준 2193. 이친수  (0) 2020.08.06
9095. 1,2,3 더하기  (0) 2020.08.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함