RUBY

[백준] 쉬운 계단 수 본문

PS/BOJ

[백준] 쉬운 계단 수

RUBY_루비 2020. 10. 1. 23:59

출처:: www.acmicpc.net/problem/10844

분류:: dp

 

1. 문제 이해 및 해결과정

- dp[i][j] = 길이가 i일때 , 끝자리가 j일 경우 계단 수의 개수
- 0은 계단수가 아니다

      j        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    ex)dp[2][0] = 길이가 2일때, 끝자리가 0인 수의 개수 =>1개, 10
    dp[3]    1 3 3 4 4 4 4 4 3 2    ex) dp[3][2] = 길이가 3일때, 끝자리가 2인 것의 개수 =>3개, 132 212 232

- dp[3][2] 를 보면, 끝자리가 2일 경우 가능한 앞자리는 1 과 3이다. 길이가 2이면서, 끝자리가 1과 3 인경우는 각각 1개(21) , 2개(43,23)이 있다. 

1) 끝자리 0일 경우, 가능한 수는 1개, 1  =>dp[i][j]=dp[i-1][j+1]
2) 끝자리 1~8일경우, 가능한 수는 2개 n-1,n+1 => dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]
3) 끝자리 9일 경우, 가능한 수는 1개, 8  => dp[i][j]=dp[i-1][j-1]

 

 

2. 풀이방법

  1. [python] dp

#쉬운 계단 수
#https://www.acmicpc.net/problem/10844
import sys
sys.stdin = open("input.txt","r")
n=int(input())
dp=[[0]*10 for _ in range(n+1)]
mod=1000000000 #저장과정에서 int값 초과할 수 있어서
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][j+1]%mod #범위초과 방지를 위해 중간과정에도 mod필요 
        elif j==9:
            dp[i][j]=dp[i-1][j-1]%mod
        else:
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]%mod

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

 

3. 오답원인

 

4. 알게된 점

 

'PS > BOJ' 카테고리의 다른 글

[백준] 일곱난쟁이  (0) 2020.10.01
[백준] 수 이어 쓰기 1  (0) 2020.10.01
[백준] 조합 0의 개수  (0) 2020.09.30
[백준] 2진수 8진수  (0) 2020.09.30
[백준] 골드바흐 파티션  (0) 2020.09.30
Comments