๋ฌธ์
์ ์ 4๋ฅผ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์ด 7๊ฐ์ง๊ฐ ์๋ค. ํฉ์ ๋ํ๋ผ ๋๋ ์๋ฅผ 1๊ฐ ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
์ ์ n์ด ์ฃผ์ด์ก์ ๋, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
## ์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ ์ n์ด ์ฃผ์ด์ง๋ค. n์ ์์์ด๋ฉฐ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
## ์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค, n์ 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ์๋ฅผ 1,000,000,009๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋งํ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด (์ถ๊ฐ ์๊ฐ ์์) | 512 MB | 30097 | 10989 | 8392 | 34.724% |
https://www.acmicpc.net/problem/15988
ํ์ด
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
n=1 ์ผ๋, 1
n=2 ์ผ๋, 1+1 2
n=3 ์ผ๋, 1+1+1 1+2 2+1 3
n=4 ์ผ๋, 1+1+1+1 / 1+1+2 / 1+2+1 / 2+1+1 / 2+2 / 1+3 / 3+1
n=4๋ฅผ ์์ธํ ๋ค์ฌ๋ค๋ณด๋ฉด 3์ผ๋์ ๋ฐฉ๋ฒ์ +1์ ํ๊ฐ๋ค์ด ๋ณด์ด๊ณ , 2์ผ๋์ ๋ฐฉ๋ฒ์ +2 ํ ๊ฐ๋ค์ด ๋ณด์ด๊ณ , 1์ผ๋์ ๊ฐ์ +3ํ ๊ฐ๋ค์ด ๋ณด์ธ๋ค. ์ด๋ฅผ ํตํด ์ ํ์์ ๊ตฌํ๋ฉด
dp[n] = dp[n-1] + dp[n-2] + dp[n-3]
์ฌ๊ธฐ๊น์ง๊ฐ ์ด์ ์ ํ์๋ ๋ฌธ์ ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํธ๋ ๊ฒ์ด๊ณ , ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด n์ ์์์ด๋ฉฐ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ ์กฐ๊ฑด์ด ์๋ค.
n์ด 1,000,000 ๊น์ง ๋ฒ์๋ผ๋ฉด, dp์ ํ์์ ์ฑ์ฐ๋ ๋ง์
์ ์๊ฐํด๋ณด์.
ํผ๋ณด๋์น๋ฅผ ๊ตฌํ ๋ n=47์ผ๋๋ถํฐ int์ ๋ฒ์๋ฅผ ์ด๊ณผํ๋ค.
์ฆ, ๋๋จธ์ง์ฐ์ฐ์ ํ๊ธฐ์ ์ (dp[i-1] + dp[i-2] + dp[i-3]) ์ ๊ฐ์ด 1000000009 x 1000000009 ๊ฐ ๋์ฌ์ ์๋ ๊ฒ์ด๋ฏ๋ก long์ผ๋ก ํด๊ฒฐํ๋ค.
์ฝ๋
package ๊ธฐ์ด1.Day19.์ ํด์;
import java.util.Scanner;
public class _123๋ํ๊ธฐ3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
long[] dp = new long[1_000_001];
//์ด์ ์ ํ์๋ 123๋ํ๊ธฐ ๋ฌธ์ ์ ๋์ผํ๋ฐ ๊ณ ๋ คํ ์ ์ด ์๋ค.
//1. ์ ํ ๋ฒ์๊ฐ ์๊น. > ๋ชจ๋๋ฌ ์ฐ์ฐ.
//n์ด 1,000,000 ๊น์ง ๋ฒ์๋ผ๋ฉด, dp์ ํ์์ ์ฑ์ฐ๋ ๋ง์
์ ์๊ฐํด๋ณด์.
//ํผ๋ณด๋์น๋ฅผ ๊ตฌํ ๋ n=47์ผ๋๋ถํฐ int์ ๋ฒ์๋ฅผ ์ด๊ณผํ๋ค.
//์ฆ, ๋๋จธ์ง์ฐ์ฐ์ ํ๊ธฐ์ ์ (dp[i-1] + dp[i-2] + dp[i-3]) ์ ๊ฐ์ด 1000000009 x 1000000009 ๊ฐ ๋์ฌ์ ์๋ ๊ฒ์ด๋ฏ๋ก
//long์ผ๋ก ํด๊ฒฐํ๋ค.
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for(int i=4; i<dp.length; i++){
dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % 1_000_000_009;
}
for(int i=0; i<t; i++){
int n = sc.nextInt();
System.out.println(dp[n]);
}
sc.close();
}
}