https://www.acmicpc.net/problem/11057
정답률 47.792%
오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다.
예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.
수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.
2
55
우선 오르막 수의 규칙성을 찾아본다.
9로 시작하는 오르막 수는 무조건 1개가 될 수 밖에 없다. 그리고 N = 2일 때 8로 시작하는 오르막 수를 보면 N = 1일 때의 8, 9를 가져 오고, N = 3일 때 8로 시작하는 오르막 수를 보면 N = 2일 때의 88, 89, 99를 가져온다. 즉, i로 시작하는 오르막 수의 개수는 이전 자릿수의 i와 i+1로 시작하는 오르막 수의 개수의 합이 된다.
따라서 dp배열을 다음과 같이 정의한다.
dp[i]: 현재 자릿수에서 i로 시작하는 오르막 수의 개수
우선 N = 1일 때는 모든 오르막 수의 개수가 1개 이므로 1로 초기화 한다.
long[] dp = new long[10];
Arrays.fill(dp, 1);
그리고 자릿수가 N이 될 때까지 반복하며 dp배열을 갱신한다. 이때 모듈러 연산( % % % % )을 적용한다.
for (int i = 2; i <= N; i++) {
for (int j = 8; j >= 0; j--) {
dp[j] = (dp[j] + dp[j + 1]) % 10_007;
}
}
문제의 답은 결국 오르막 수의 총 개수이므로 dp배열의 모든 원소의 값을 더해야 하는데 이때도 모듈러 연산을 사용해야 한다.
long result = 0;
for (long num : dp) {
result = (result + num) % 10_007;
}
//백준
public class Main {
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
long[] dp = new long[10];
Arrays.fill(dp, 1); //N = 1일 때 오르막 수는 모두 1개
//자릿수가 N이 될 때까지 반복
for (int i = 2; i <= N; i++) {
for (int j = 8; j >= 0; j--) {
dp[j] = (dp[j] + dp[j + 1]) % 10_007;
}
}
long result = 0;
for (long num : dp) {
result = (result + num) % 10_007;
}
System.out.println(result);
}
}