오르막 수 만들기
1112 1234 1345 이런식으로 인접한 숫자가 같거나 점점 오르는 형태의 수여야한다.
따라서 첫번 째 수에따라 만들 수 있는 수가 달라진다.
두 자리 수를 만들때
첫번째 숫자가 1이면 1 2 3 4 5 6 7 8 9 를 붙여 9개의 숫자를 만들 수 있고
첫번째 숫자가 4이면 44 45 46 47 48 49 6개 숫자를 만들 수 있다
세 자리 숫자를 만들때
만약 첫 숫자가 0이면 뒤에 모든 숫자가 올 수 있으니
두자리 숫자의 전체 갯수 55개의 숫자가 올 수 있고
첫 숫자가 1이면 55에서 두번 째 자리 숫자가 0이 올 수 없다
따라서 0으로 만들 수 있는 두자리 수를 다 빼줘야한다.
위 연산을 계산하기 위해 2차원 배열 dp를 만들었고
dp[ i ][ j ]에서 i는 i자릿수, j는 i자릿수 j번째 숫자를 나타낸다
3자리로 만들 수 있는 전체 오르막 수
9 : 55
8 : 45 +10 dp[2][9]
7 : 36 +9
6 : 28 +8
5 : 21 +7
4 : 15 +6
3 : 10 +5
2 : 6 +4
1 : 3 +3
0 : 1 +2 dp[2][1]
dp[2][1]을 구하기 위해서 dp[1][0] + dp[1][1] 을 더해야한다.
따라서 점화식은 아래와 같다.
dp[i][j] = dp[i][j-1] + dp[i-1][j]
주의할 점
1. 계산 한 수에 10007을 나눈 후 나머지를 저장하자.
2. 역수에서 빼는 순서 (55-10 > 45-9) 가 아닌 더해가는 순서로 계산
( 10007이상의 수는 나머지로 계산되므로 주의)
// 오르막 수
// https://www.acmicpc.net/problem/11057
import java.util.Scanner;
public class B11057 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
long[][] dp = new long[1001][10];
long[] sum = new long[1001];
sum[1] = 10;
for(int i =0; i<10; i++){
dp[1][i] = 1;
}
for(int i=2; i<=N; i++){
dp[i][0] = 1;
sum[i] = dp[i][0];
for(int j=1; j<10; j++){
dp[i][j] = (dp[i][j-1] + dp[i-1][j])%10007;
sum[i] += dp[i][j];
}
}
System.out.println(sum[N]%10007);
}
}
'연습문제 > JAVA' 카테고리의 다른 글
[백준 java] 11048 - 이동하기 (2) | 2022.09.09 |
---|---|
[백준 java] 10884 - 쉬운 계단 수 (0) | 2022.09.09 |
[백준 java] 11727 - 2xn 타일링 2 (0) | 2022.09.07 |
[백준 java] 7576 - 토마토 (0) | 2022.09.05 |
[백준 java] 1874 - 스택 수열 (0) | 2022.09.04 |