반응형
📖 문제
📋 코드
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int MOD = 1000000000;
int dp[][] = new int[101][10];
for (int i = 1; i <= 9; i++) {
dp[1][i] = 1;
}
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= 8; j++) {
dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%MOD;
}
dp[i][0] = dp[i-1][1];
dp[i][9] = dp[i-1][8];
}
int ans = 0;
for (int i = 0; i <= 9; i++) {
ans += dp[N][i] % MOD;
ans %= MOD;
}
System.out.println(ans);
}
}
👨🏻💻 결과
📕 풀이 방법
for (int i = 2; i <= N; i++) {
for (int j = 1; j <= 8; j++) {
dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%MOD;
}
dp[i][0] = dp[i-1][1];
dp[i][9] = dp[i-1][8];
}
dp[i][j] : i 길이의 수 마지막 부분이 j일 때 계단수
예를 들어 길이가 3이고 끝부분이 5일 때 계단수는
길이가 2이고 4로 끝나는 계단수, 길이가 2이고 6으로 끝나는 계단수의 합입니다.
그리고 길이가 i이고 끝자리가 0이거나 9인 경우에는
길이가 i-1이고 각각 끝자리가 1, 끝자리가 8인 경우만 가능하므로 예외로 반복문에서 빼서 계산해줍니다.
dp[i][j] = (dp[i-1][j-1]+dp[i-1][j+1])%MOD;
오버플로우가 발생할 수 있으니 dp를 구하는 과정에도 MOD를 해줘서 오버플로우를 방지해줍시다.
🔗 링크
https://www.acmicpc.net/problem/10844
반응형
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[JAVA] 백준 11054번 - 가장 긴 바이토닉 부분 수열 (0) | 2021.10.24 |
---|---|
[JAVA] 백준 2156번 - 포도주 시식 (0) | 2021.10.20 |
[JAVA] 백준 1463번 - 1로 만들기 (0) | 2021.10.17 |
[JAVA] 백준 2579번 - 계단 오르기 (0) | 2021.10.17 |
[JAVA] 백준 1932번 - 정수 삼각형 (0) | 2021.10.15 |