알고리즘 문제/백준

백준 10844: 쉬운 계단 수

수달과 다람쥐 2024. 5. 29. 17:22

본 포스팅은 문제의 풀이 보단 작성자의 개인적인 정리에 가깝습니다.
그냥 이 사람은 이렇게 풀었구나 정도로 봐주시면 감사하겠습니다

 

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

 

문제

45656이란 수를 보자.

이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.

 

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.

 

출력

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

예제 입력1

1

예제 출력1

9

예제 입력2

2

예제 출력2

17

풀이

import sys


n = int(sys.stdin.readline().strip())
# 1 0 2
# 2 1 3
# 3 2 4
# 4 3 5
# 5 4 6
# 6 5 7
# 7 6 8
# 8 7 9
# 9 8
'''
dp[0] = 9
dp[1] = 17
dp[2] = 32
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
dp[1] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
dp[2] = [1, 1, 2, 2, 2, 2, 2, 2, 2, 1]
dp[3] = 


'''
dp = {}

dp[1] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
dp[2] = [1, 1, 2, 2, 2, 2, 2, 2, 2, 1]
# print(0 in dp)

for i in range(1,n+1):
    if(i+1 in dp):
        continue
    # temp=dp[i]
    temp = [0 for _ in range(10)]
    for j,data in enumerate(dp[i]):
        if(j==0):
            temp[j+1]+=data
        elif(j==9):
            temp[j-1]+=data
        else:
            temp[j+1]+=data
            temp[j-1]+=data
        # print(j)
    dp[i+1]=temp
    # print(i,temp)
print(sum(dp[n])%1000000000)

 

답은 위와 같습니다

조금 생각하니 간단하게 풀렸습니다. 

dp [1]의 경우는 1~9입니다

dp [2]의 경우는 10, 12,  21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98 이렇게입니다.

보면은 결국 수의 끝자리에 의해서 다음 수가 결정됩니다.

0이면 1로 2면 1이나 3으로 즉 끝자리 개수가 몇 개인지만 체크하면 됩니다.

 

dp [2]까지는 값을 직접 입력했습니다. 0의 존재로 인해서입니다. 

반응형

'알고리즘 문제 > 백준' 카테고리의 다른 글

백준 30804번: 과일탕후루  (0) 2024.06.18
백준 9375번: 패션왕 신해빈  (0) 2024.05.31
백준 7576번: 토마토  (0) 2024.05.29
백준 7569번: 토마토  (0) 2024.05.29
백준 1107번: 리모컨  (0) 2024.05.28