๋ฌธ์
์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 3๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค. ๋จ, ๊ฐ์ ์๋ฅผ ๋ ๋ฒ ์ด์ ์ฐ์ํด์ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
- 1+2+1
- 1+3
- 3+1
์ ์ n์ด ์ฃผ์ด์ก์ ๋, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
## ์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ n์ด ์ฃผ์ด์ง๋ค. n์ ์์์ด๋ฉฐ 100,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
## ์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ 1,000,000,009๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด (์ถ๊ฐ ์๊ฐ ์์) | 512 MB | 26395 | 8918 | 6250 | 30.858% |
https://www.acmicpc.net/problem/15990
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
์ด๋ฌธ์ ๋ก ํ์ฐธ์ ๊ณ ๋ฏผํ๋ค... dp๋ฅผ ์ฌ์ฉํด์ 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์๋ฌด๋ฆฌ ์๊ฐ์ ํด๋ด๋ ์ํ๋ฆฌ๋ ๊ฒ์ด๋ค. ๋ด๊ฐ ๊ณ ๋ฏผ์ ํ๋ค๊ฐ ์ํ๋ ธ๋ ๋ถ๋ถ์ด ๋ง์ฝ 3์ผ ๊ฒฝ์ฐ 1+1+1, 1+2, 3
์ด๋ ๊ฒ 3๊ฐ์ง์ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ณ , ์ ์ผ ๋ท์๋ฆฌ๊ฐ 1์ผ๋, 2์ผ๋, 3์ผ๋๋ฅผ ๊ตฌ๋ถ์ง์ด์ฃผ๋ ๋ถ๋ถ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ๋์ ํ ๊ฐ์ด ์์๋ค. ๊ทธ๋์ ์ฐพ์๋ณด๋... ์ค๋ง๊ฐ ์ง์ง ์ฌ๋๋ค ๋๋ํด๐
์๊ทธ๋ผ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์!
์ด๋ฌธ์ ๋ ์ผ๋จ DP์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผํ๋ค.
DP ๋ฌธ์ ์ด๋ฏ๋ก ๋จผ์ ๊ณตํต์ ์ ์ฐพ์ ๋ด๋๊ฒ์ด ์ค์ํ๋ค. ๋ฌธ์ ๋ฅผ ์์ ๋จ์๋ถํฐ ์ฒ์ฒํ ํ์ด ๋ณด์๋ค.
1 > 1
2 > 1+1, 2
3 > 1+1+1, 2+1, 1+2, 3
4 > (1+1+1+1, 2+1+1, 1+2+1, 3+1), (1+1+2, 2+2), (1+3)
์ด์ ๋๋ฉด ์ด์ ์ด๋์ ๋ ๊ณตํต์ ์ด ๋ณด์ฌ์ผํ๋ค.
- 4๋ฅผ ๋ง๋ค๋, 3์ ๋ง๋๋ ๊ฒฝ์ฐ +1
- 4๋ฅผ ๋ง๋ค๋, 2๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ +2
- 4๋ฅผ ๋ง๋ค๋, 1์ ๋ง๋๋ ๊ฒฝ์ฐ +3
(์ฌ๊ธฐ์์ 2๋ฒ์ด์ ์ค๋ณต๋๋ ๋ถ๋ถ์ ์ ๊ฑฐํ๊ณ dp์ ๊ธฐ๋กํ๋ฉด ๋๊ฒ ๊ตฌ๋.)
์ด๋ฅผ ๋ฐํ์ผ๋ก dp๋ฅผ ๋ํ๋ด๋ณด๋ฉด,
dp[i][j] // i: ์์์ ์ ์, j: ๋ง์
์ด j๋ก ๋๋จ
์ด๋ ๊ฒ ๋ณด๋ฉด ๋๊ฒ ๋ค. ๊ทธ๋ผ ์์๋ฅผ ๋ค์ด๋ณด์.
3์ ๋ง๋๋ ๊ฒฝ์ฐ
- 1+1+1 =>
dp[3][1] = 1
- 1+2 =>
dp[3][2] = 1
- 2+1 =>
dp[3][1] = 1
- 3 =>
dp[3][3] = 1
5๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ
5๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ฅผ ์์ธํ๊ฒ ์์๋ณด์.
5๋ฅผ 1, 2 ,3 ์ ํฉ์ผ๋ก ๋ํ๋ด๋ณด์.
2๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ 3์ ๋ํ๊ณ ,
3์ ๋ง๋๋ ๊ฒฝ์ฐ์ 2๋ฅผ ๋ํ๊ณ ,
4๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ 1์ ๋ํ๋ฉด 5๊ฐ ๋ ๊ฒ์ด๋ค.
(์ด๋ ๊ฐ์ ์๋ฅผ 2๋ฒ ์ฐ์์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค. ์ฆ, ์ด์ ์ ์ฌ์ฉํ ๊ฐ์ ์ ๊ฑฐํ๋ค.)
1) 5๋ฅผ ๋ง๋๋ ์์์ค์
1๋ก ๋๋๋ ์์(๋ง์ง๋ง์ 1์ ๋ํด์ฃผ๋ ๊ฒฝ์ฐ)์
4๋ฅผ ๋ง๋๋ ์์์์ 2๋ก ๋๋๋ ๊ฒ์ 1๋ฅผ ๋ํ๋๊ฒ,
4๋ฅผ ๋ง๋๋ ์์์ค์์ 3์ผ๋ก ๋๋๋ ๊ฒ์ 1์ ๋ํ๋ ๊ฒ์ด๋ค.
(๊ฐ์ ์ ์ฐ์ 2๋ฒ์ ์๋๊ธฐ ๋๋ฌธ์ 1๋ก ๋๋๋ ๊ฒ์ ์ ์ธํ๋ค.)
์ด๋ฅผ ๋ํ๋ด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
dp[5][1] = dp[4][2] + dp[4][3];
// ์ด๊ฒ์ ์ผ๋ฐํ ํ๋ฉด ์๋์ ๊ฐ๋ค.
dp[n][1] = dp[n-1][2] + dp[n-1][3];
2) 2๋ฅผ ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์
๋ง์ง๋ง์ 2๋ฅผ ๋ํด์ฃผ๋ ๊ฒฝ์ฐ๋,
3์ ๋ง๋๋ ์์์์ 1๋ก ๋๋๋ ๊ฒ์ 2๋ฅผ ๋ํ๋๊ฒ,
3์ ๋ง๋๋ ์์์์ 3์ผ๋ก ๋๋๋ ๊ฒ์ 2๋ฅผ ๋ํ๋ ๊ฒ์ด๋ค.
(์ด๊ฒ ๋ํ ๊ฐ์ ์๋ฅผ ์ฐ์์ผ๋กํ๋ฉด ์๋๋ฏ๋ก 2๋ก ๋๋๋ ๊ฒ์ ์ ์ธ ๋๋ค.)
dp[5][2] = dp[3][1] + dp[3][3];
// ์ด๊ฒ์ ์ผ๋ฐํ ํ๋ฉด ์๋์ ๊ฐ๋ค.
dp[n][1] = dp[n-2][1] + dp[n-2][3];
3) 3์ ๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์
๋ง์ง๋ง์ 3์ ๋ํด์ฃผ๋ ๊ฒฝ์ฐ๋,
2๋ฅผ ๋ง๋๋ ์์์์ 1๋ก ๋๋๋ ๊ฒ์ 3์ ๋ํ๋๊ฒ,
2๋ฅผ ๋ง๋๋ ์์์์ 2๋ก ๋๋๋ ๊ฒ์ 3์ ๋ํ๋๊ฒ์ด๋ค.
(์ด๊ฒ๋ ๊ฐ์ ์๋ฅผ ์ฐ์์ผ๋ก ๋์ดํ ์์์ผ๋ฏ๋ก 3์ผ๋ก ๋๋๋ ๊ฒ์ ์ ๊ฑฐํ๋ค.)
dp[5][3] = dp[2][1] + dp[2][2];
// ์ด๊ฒ์ ์ผ๋ฐํ ํ๋ฉด ์๋์ ๊ฐ๋ค.
dp[n][3] = dp[n-3][1] + dp[n-3][2];
์ด๋ฌํ ๊ณผ์ ์ ํตํด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ํ์์ ๋์ถํด ๋ผ์์๋ค.
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1_000_000_009;
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1_000_000_009;
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1_000_000_009; (n >= 4)
์ ํ์์์ ๋ชจ๋๋ฌ๋ฅผ ์ฌ์ฉํ๋ ์ด์
10์ต9๋ก ๋๋ ์ ์ถ๋ ฅํ๋ผ๋ ์ ํ ์ฌํญ์ด ์๋๋ฐ, ๋ง์ง๋ง์ ๋ชจ๋๋ฌ๋ฅผ ๋ฃ๊ฒ๋๋ฉด ๊ฐ์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ง์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ณ์ฐ ๊ณผ์ ์ค๊ฐ์ ๋ชจ๋๋ฌ๋ฅผ ์ฝ์ ํ๋ค.
์ฝ๋
import java.util.Scanner;
public class _123๋ํ๊ธฐ5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
long[][] dp = new long[100001][4];
dp[1][1] = 1; // 1
dp[2][2] = 1; // 2
dp[3][1] = 1; // 2+1
dp[3][2] = 1; // 1+2
dp[3][3] = 1; // 3
for(int i=4; i<=100000; i++){
dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1_000_000_009;
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1_000_000_009;
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1_000_000_009;
}
for(int i=1; i<=t; i++){
int n = sc.nextInt();
System.out.println((dp[n][1] + dp[n][2] + dp[n][3]) % 1_000_000_009);
}
sc.close();
}
}