문제
10844번: 쉬운 계단 수
첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.
www.acmicpc.net
참고 (1)
백준 10844번 쉬운 계단 수 :: 마이구미
이 글은 백준 알고리즘 문제 10844번 "쉬운 계단 수" 를 풀이한다. 풀이 방법으로는 동적계획법으로 설명한다. 문제 링크 - https://www.acmicpc.net/problem/10844 45656이란 수를 보자. 이 수는 인접한 모든 ��
mygumi.tistory.com
dp[N][L] = dp[N-1][L-1] + dp[N-1][L+1]
→ 길이가 N일 때, 마지막 수가 L일 경우의 계단 수
L = 0 → dp[N][L] = dp[N-1][L+1]
L = (1~8) → dp[N][L] = dp[N-1][L-1] + dp[N-1][L+1]
L = 9 → dp[N][L] = dp[N-1][L-1]
(0은 +1을 한 1만 허용되고, 9는 -1을 한 8만 적용되기 때문이다)
참고 (2)
위의 블로그가 이해 안된다면 영상으로 보는 것도 좋을 거 같다
1.75배속하면 적당한 속도가 된다ㅎ
www.youtube.com/watch?v=DkSVYYC_ANw
위 영상에서는 점화식이
dp[N][i] = dp[N-1][i-1] + dp[N-1][i+1]
임을 알려준다.
이 때,
dp[a][b] : a는 a번째 자리수, b는 a번째 자리수의 숫자이다.
→ dp[3][1] : 세자리 수, 3번째 자리 수가 1인 계단수의 개수
www.youtube.com/watch?v=nwqOSTa2c58
0번째, 9번째 처럼 예외 처리 해줘야 하는 경우에 대해서 설명해주심
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
long[][] dp = new long[N+1][10];
for(int i=1; i<=9; i++) {
dp[1][i] = 1;
}
for(int i=2; i<=N; i++) {
dp[i][0] = dp[i-1][1];
for(int j=1; j<9; j++) {
dp[i][j] = (dp[i-1][j-1] + dp[i-1][j+1])%1000000000;
}
dp[i][9] = dp[i-1][8]%1000000000;
}
long sum = 0;
for(int i=0; i<10; i++) {
sum+=dp[N][i];
}
bw.write(Long.toString(sum%1000000000)+"\n");
bw.flush();
}
}