
길이가 N인 계단 수의 개수를 출력하면 되는 문제이다.
- DP를 사용해 i(1<=i<=9)로 시작하는 길이가 N인 계단수의 개수를 구한다.
- 1,2,3,...9로 시작하는 길이가 N인 계단수의 개수를 모두 합하여 출력한다.
int[][] memo = int[10][N+1]
memo[i][n]에는 i로 시작하는, 길이가 n인 계단수의 개수를 저장한다.
이해가 쉽게 예를 들자면, memo[1][2]는 1로 시작하는 길이가 2인 계단 수의 개수이다. 10,12로 2개가 있으므로 memo[1][2]=2가 될 것이다.
0으로 시작하는 수는 계단수가 아니므로 memo[1~9][N]를 구하고 전부 합해주면, N 길이의 계단수의 개수를 모두 구할 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int[][] memo;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
memo = new int[10][N+1]; // 0~9로 시작하는 길이가 N인 계단수의 개수
for(int i=0; i<=9; i++) {
memo[i][1] = 1;
}
long sum = 0;
for(int i=1; i<=9; i++) {
dp(i,N);
sum += memo[i][N];
}
System.out.println(sum%1000000000);
}
static void dp(int num, int len) {
if(len==0 || memo[num][len]!=0) return;
if(num > 0) {
dp(num-1,len-1);
memo[num][len] = (memo[num][len]+memo[num-1][len-1])%1000000000;
}
if(num < 9) {
dp(num+1,len-1);
memo[num][len] = (memo[num][len]+memo[num+1][len-1])%1000000000;
}
}
}
💥 위 코드의 dp 메서드 안에서 %1000000000 를 매번 해주어야 정답 처리가 된다.
전부 더한 뒤 sum에만 나머지연산 처리를 해줬더니 실패가 떴다.
사실 이 문제는 포스팅을 할 정도로 의미있는 알고리즘을 사용했거나 어렵진 않았지만 내 채점 현황을 보고 웃겨서 기록하고 싶었다 ..

ㅋㅋㅋㅋㅋ 1년 전의 나는 얼마나 짜증났을까 ?... 토닥토닥 ...
많이 성장했다 ...
하면 는다 !!!! 아자아자 화이팅