1. ๋ฌธ์ ์ค๋ช
์ซ์์ ์๋ฆฟ์๊ฐ ์ฃผ์ด์ง ๋, ํด๋น ์๋ฆฟ์๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค ์ ์๋ ์ค๋ฅด๋ง์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ.
์ค๋ฅด๋ง์?
์ซ์์ ๊ฐ์ฅ ์ผ์ชฝ๋ถํฐ ์์ํด ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์๋ก ์๋ฆฟ์์ ํฌ๊ธฐ๊ฐ ์์์ง์ง ์๋ ์๋ฅผ ์ค๋ฅด๋ง์๋ผ๊ณ ํ๋ค. ๋ค์ ๋งํด,
1234, 2569 ๋ฑ์ด ์ค๋ฅด๋ง์์ด๋ค.
์์์ง์ง ์์ผ๋ฉด ๋๋ค๊ณ ํ์์ผ๋ฏ๋ก,
1111, 1119๋ ์ค๋ฅด๋ง์๊ฐ ๋๋ค.
2. ์ ๊ทผ ๋ฐฉ์
KEYWORD
: DP
์๋ฆฟ์๊ฐ 1000์ ์๋ฆฌ๊น์ง ์ฃผ์ด์ง๋ค. ์ค๋ณต ์์ด
๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค๋ฉด, O(1000!) ์ด๋๊น, ๋น์ฐํ ๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฌธ์ ๋ DP๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด, DP๋ ์ด๋ป๊ฒ ์๊ฐํด์ผ ํ ๊น?
2์ฐจ์ ๋ฐฐ์ด๋ก DP๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ๋ค. ์ธ๋ก
๋ ์๋ฆฟ์, ๊ฐ๋ก
๋ ๋งจ์ผ์ชฝ์ ์ซ์๊ฐ ๋ฌด์์ผ๋ก ์์ํ๋์ง ๋ํ๋ด๋ ๊ฒ์ด๋ค.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
3 | 55 | 45 | 36 | 29 | 23 | 18 | 14 | 11 | 9 | 8 |
4 | 220 | --- | --- | --- | --- | --- | --- | --- | --- | --- |
์๋ฆฟ์๊ฐ 1๊ฐ์ผ ๋๋ ๋น์ฐํ ๋งจ ์ผ์ชฝ start ์ซ์ ํ๋๋ง ์ฐ์ผ ๊ฒ์ด๊ณ , ๊ฐ ์ซ์๋ง๋ค ๊ฒฝ์ฐ์ ์๊ฐ 1๋ง ์กด์ฌํ ๊ฒ์ด๋ค.
์๋ฆฟ์๊ฐ 2๊ฐ์ผ ๊ฒฝ์ฐ, 0์ผ๋ก ์์ํ๋ฉด 2๋ฒ์งธ ์๋ฆฌ๊ฐ 0~9๊น์ง 10๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก, 10๊ฐ, ๊ฐ์ ๋ฐฉ์์ผ๋ก 9,8,7,6,5 ... ์ด๋ ๊ฒ ๊ฐ ๊ฒ์ด๋ค.
์๋ฆฟ์๊ฐ 3๊ฐ์ผ ๋๋ฅผ ๋ณด์. 0์ผ๋ก ์ผ์ชฝ start ํ๋ฉด ๊ฐ๋ฅํ ์ค๋ฅด๋ง์์ ๊ฐ์๊ฐ 55๊ฐ์ด๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌํ์๊น?
DP์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ด์ ์ ๊ตฌํ ๊ฐ๋ค์ ์ด๋ป๊ฒ ์ฌํ์ฉํ ๊ฒ์ธ๊ฐ?
์ด๋ค.
๋ค์์, 2๋ฒ์งธ ์๋ฆฟ์๊น์ง์ ์ค๋ฅด๋ง์๋ฅผ ๋ํ๋ธ ๋ชจ์ต์ด๋ค. ์ด์ ์ด๊ฒ๋ค์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๊ณ , ์ผ์ชฝ์ ์๋ก์ด ์ซ์๋ฅผ ๋ฃ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ง์ฝ ๋งจ์ผ์ชฝ์ ์๊ฐ 0์ด๋ผ๋ฉด 2๋ฒ~3๋ฒ๊น์ง๋ ์ด๋๊น์ง ํ์ฉํ ์ ์์๊น?
2~3๋ฒ์งธ๋ ์๋ฆฟ์๊ฐ 2๊ฐ์ผ ๋ ๊ตฌํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ค์ ๋ค ์ธ ์ ์๋ค. ๋ฐ๋ผ์ dp[3] [0] = (10+9+8+...) = 55 ์ด๋ค. ๋๋จธ์ง ์๋ค์ ๋ช ๊ฐ์ง๋ง ์์๋ก ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
์ด๋ ๊ฒ ๋๋ฉด, 3์๋ฆฟ์๊น์ง ๋์ฌ ์ ์๋ ๋ชจ๋ ์ค๋ฅด๋ง์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ๊ณ ํ๋ค๋ฉด dp[4] [0]์ 3์๋ฆฟ์์์ ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ํฉ์ด๋ฏ๋ก, ๋ต์ dp[4] [0]์ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
๋ชจ๋๋ฌ ์ฐ์ฐ ์ฐ๋ ๋ฒ
๊ทธ ๋ค์ ๊ณ ๋ฏผํด์ผํ ๊ฒ์ด ๋ชจ๋๋ฌ ์ฐ์ฐ ์ฌ์ฉ์ด๋ค. ๋ฌธ์ ์์ ๋ต์, ๋์ฌ ์ ์๋ ์ค๋ฅด๋ง ์์ ๊ฐ์๋ฅผ 10007๋ก ๋๋ ์๋ฅผ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค. ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
(A + B) % N = (A%N + B%N)%N
์ฆ๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค.
A = q1*N + r1
B = q2*N + r2 // ๋ผ๊ณ ํ๋ฉด,
(A+B)%N = (q1*N + r1 + q2*N + r2)%N // ์ด๋, %N์ ํ์ด์ ๊ตฌํ๋ฉด q1*N๊ณผ q2*N์ ๋๋จธ์ง๊ฐ 0์ด๋ฏ๋ก ์ฌ๋ผ์ง.
//๋ฐ๋ผ์
(q1*N +r1 + q2*N +r2)%N = (r1 + r2)%N
r1 = A%N, r2 = B%N // ์ด๋ฏ๋ก
(A+B)%N = (r1 + r2)%N = (A%N + B%N)%N
ํด๋น ๋ชจ๋๋ฌ ์ฐ์ฐ์ ๋ง์ ๋ฟ๋ง ์๋๋ผ ๋บ์ , ๊ณฑ์ ์์๋ ๊ฐ์ ์๋ฆฌ๋ก ์ฆ๋ช ๋๋ฏ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์์ ์๋ฆฌ๋ฅผ ์ฐ๋ฆฌ์ ๋ฌธ์ ์ ์ ์ฉํด์ผํ๋ ์ด์ ๋, N์๋ฆฟ์์์ ๊ฐ๋ฅํ ์ค๋ฅด๋ง ์์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋์ค์, ๋ถ๋ถํฉ์ด ์ด๋ฏธ int์ ์ต๋๊ฐ์ ๋์ด๋ฒ๋ฆฌ๋ฉด, ์ค๋ฒํ๋ก์ฐ๊ฐ ๋์ด์ ๊ฐ์ด ์ด์ํด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ฌธ์ ์์๋ 10007์ด๋ผ๋ ์๋ก ๋๋๋ผ๊ณ ๋ฐฐ๋ คํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ dp์์ ์ค๋ฅด๋ง ๊ฐ์๋ฅผ ๊ตฌํ ๋ ๊ฐ ๊ฐ๋ง๋ค 10007๋ก ๋๋ ์ค๋ค. ๋ฐ๋ผ์ ์ ํ์์
dp[N][j] = S(dp[N-1][k]%10007);
// k๋ j๋ณด๋ค ์์ ์ , S()๋ dp[N-1][0]%10007 ~ dp[N-1][k]%10007๊น์ง์ ํฉ
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int [][] dp = new int[N+1][10];
Arrays.fill(dp[0], 1);
for (int i = 1; i <= N; i++) {
for (int j = 0; j < 10; j++) {
for (int k = j; k < 10; k++) {
dp[i][j] += (dp[i-1][k]%10007);
}
dp[i][j] %= 10007;
}
}
System.out.println(dp[N][0]);
}
}