Algorithm/백준(BOJ)
[백준] 11057. 오르막 수 (Java)
Carroti
2022. 12. 2. 17:18
문제
11057번: 오르막 수
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수
www.acmicpc.net
알고리즘
다이나믹 프로그래밍(DP)
풀이
[N + 1][10] 크기의 2차원 배열를 선언하여 다음과 같이 저장하였다.
dp[i][j] = 길이 i의 j로 끝나는 숫자 중 오르막 수의 개수
만약 j로 끝나는 오르막 수라면 그 전에는 j보다 작거나 같은 수가 올 수 있다.
따라서 점화식은 다음과 같다.
dp[i][j] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] + ... + dp[i-1][j]
위 방식으로 길이 N까지 경우의 수를 구한 후 dp[N][0] ~ dp[N][9] 를 더해 출력한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
final int divisor = 10_007;
int N = Integer.parseInt(br.readLine());
int[][] dp = new int[N + 2][10];
Arrays.fill(dp[1], 1);
for (int i = 2; i <= N + 1; i++)
for (int j = 0; j < 10; j++)
for (int k = 0; k <= j; k++)
dp[i][j] = (dp[i][j] + dp[i - 1][k]) % divisor;
System.out.println(dp[N + 1][9]);
}
}