티스토리 뷰


 

45656과 같이 모든 자릿수가 1씩 차이나는 수를 계단 수라 정의하고, 주어진 N자리 수의 총 계단의 수를 파악하는 문제이다.

N의 수는 N-1의 1의 자리 수 +- 1을 1의 자리 수에 추가하는 규칙을 가지고 있다는 것을 발견하고 나열 하면 아래와 같이 나타난다.

 

N=1

1, 2, 3, 4, 5, 6, 7, 8, 9



N=2

10, 21, 32, 43, 54, 65, 76, 87, 98

12, 23, 34, 45, 56, 67, 78, 89

....

 

위와 같이 나열하다 보니 아래와 같은 점화식을 도출해 낼 수 있었다.

N = 짝수  2 * D[i-1] - (i-1)

N = 홀수  2 * (D[i-1] - (i-2))

 

하지만 적절한 점화식이 아니었고 다른 분의 풀이를 참고하였다. 

 

   1의 자리수
N   0  1  2  3  4  5  6  7  8  9

1   0  1  1  1  1  1  1  1  1  1

2   1  1  2  2  2  2  2  2  2  1  

3   1  3  3  4  4  4  4  4  3  2

...

 

위에서 말했듯이 N자리 계단 수는 N-1의 1의 자리 수 +- 1를 1의 자리에 추가한 결과이다. 각 1의 자리수 개수를 표로 나타내면 위와 같다.

 

점화식으로 나타내면 

 

D[n][0] = D[n-1][1]

D[n][9] = D[n-1][8]

D[n][i] = D[n-1][i-1] + D[n-1][i+1] 로 나타낼 수 있다.

 

 

소스 코드

from sys import stdin
readline = stdin.readline

MOD = 1000000000
def main():
    N = int(readline().strip())
    d = [[0] * 11 for _ in range(101)]

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

    for i in range(2, N+1):
        d[i][0] = d[i-1][1]
        for j in range(10):
            d[i][j] = (d[i-1][j-1] + d[i-1][j+1]) % MOD

    print(sum(d[N]) % MOD)


if __name__=="__main__":
    main()

 

메모리를 줄이기 위해 슬라이딩 윈도우 기법도 사용 가능하다.

from sys import stdin
readline = stdin.readline

MOD = 1000000000
def main():
    N = int(readline().strip())
    d = [[0] * 11 for _ in range(2)]

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

    ans = 9
    for i in range(2, N+1):
        ans = 0
        for j in range(10):
            d[i%2][j] = (d[(i-1)%2][j-1] + d[(i-1)%2][j+1]) % MOD
            ans += d[i%2][j] % MOD
    print(ans % MOD)


if __name__=="__main__":
    main()
728x90

'PS > 백준' 카테고리의 다른 글

[백준] 2098 외판원 순회  (0) 2021.02.15
[백준] 1937 욕심쟁이 판다  (0) 2021.02.10
[백준] 2294 동전2  (0) 2021.02.07
[백준] 2156 포도주 시식  (0) 2021.02.07
[백준] 10835 카드게임  (0) 2021.02.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함