๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/15990
ํ์ด IDEA
(DP ์ด๋ ต๋ค .. ๋์ค์ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ฅผ ์ฐ์ตํ ๋ dp ๋ถ๋ถ์ ์ง์ค์ ์ผ๋ก ๊ณต๋ตํ ๊ฒ์ด๋ค ใ ใ )
๋จผ์ ํ์๋ "๋ฐฑ์ค 9095๋ฒ 1,2,3 ๋ํ๊ธฐ" ์๋ ๋ค๋ฅด๊ฒ, ๋ํด์ง๋ ์ซ์์ "์์!!"๋ฅผ ์๊ฐํด์ผํ๋ค๋ ์ ์ด ์ด๋ ค์ ๋ค.
9095๋ฒ | 4๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์ | 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 ๊ฐ์ ์ ์ค๋ณต ๊ฐ๋ฅ |
15990๋ฒ (์ง๊ธ ๋ฌธ์ ) | 4๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒฝ์ฐ์ ์ | 1+2+1 1+3 3+1 ๊ฐ์ ์ ์ฐ์ ๊ธ์ง! |
9095๋ฒ์ ์ ํ์์ ๋ณด๋ฉด dp[n] = dp[n-1] + dp[n-2] + dp[n-3] ๋ก, ๊ทธ์ ์ค๋ณต์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ผ์ ํ ๊ท์น์ ์ฐพ์์ ๋ฌธ์ ์ ๋ต์ ์ฝ๊ฒ ๊ตฌํ ์ ์์๋ค. ํ์ง๋ง ์ง๊ธ ํ ๋ฌธ์ ์ธ 15990์ ๋ณด๋ฉด, ๊ฐ์ ์๊ฐ ์ฐ์ํด์ ๋ฑ์ฅํ์ง ์์์ผ ํ๋ค๋ ์กฐ๊ฑด์ด ๋ถ์ด์๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋ฉด ์ข์๊น?
์ฐ์ , ์์์ dp ๋ฌธ์ ๋ฅผ ํ๋ฉด์, dp ๋ฐฐ์ด์๋ '๊ฒฝ์ฐ์ ์'๋ฅผ value ๋ก ๋ฃ๋๊ฒ์ผ๋ก ์ฝ์ํ๋ค. ๊ทธ๋ผ, ์ด๋ป๊ฒ ํ๋ฉด ๋ฐ๋ก ์ด์ ์ ๊ฒฝ์ฐ์ ์๋ก๋ถํฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ฒฝ์ฐ์์๊ฐ ๋๊ฒ ๋๊ฐ?๋ฅผ ์๊ฐํด๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์๊ฐํ ์ ์๋ค.
- ๋งจ ๋ค์ ์ซ์๊ฐ [1] ์ธ ๊ฒฝ์ฐ, [2] ๋ [3] ์ ๋ํ ์ ์๋ค.
- ๋งจ ๋ค์ ์ซ์๊ฐ [2] ์ธ ๊ฒฝ์ฐ, [1] ์ด๋ [3] ์ ๋ํด์ค ์ ์๋ค.
- ๋งจ ๋ค์ ์ซ์๊ฐ [3] ์ธ ๊ฒฝ์ฐ, [1] ์ด๋ [2] ๋ฅผ ๋ํด์ค ์ ์๋ค.
์ด๋ ๊ฒ ์ธ๊ฐ์ง๋ก ๋๋์ด์ ์๊ฐํด๋ณผ ์ ์๋ค. ์ด ์ธ๊ฐ์ง๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํํ ๊ฑฐ๋ค. dp[i][1], dp[i][2], dp[i][3] ์ผ๋ก ํด์ 1๋ก๋๋๋ ๊ฒฝ์ฐ์ ์ ๋ฅผ dp[i][1] ์, 2๋ก ๋๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ dp[i][2] ์ ๋ง์ด๋ค.
๊ทธ๋ผ ๋ ์ฌ์ด ์ดํด๋ฅผ ์ํด์ ์ซ์ 6์ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด์. ์ฐ์ , ์ฐ๋ฆฌ๋ 1,2,3์ ๊ฐ์ง๊ณ ๊ณ์ฐ์ ํ๋ค. ๋ํ ์ ์๋ ์์์ 3์ด ์ต๊ณ ์ซ์์ด๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ 3์ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ถํฐ ๋ฐ์ง๋ฉด ๋๋ค.
5๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์ (1์ ๋ํด์ฃผ์ด์ผ 6์ด ๋๋ค!) |
2+1+2 1+3+1 2+3 3+2 (4๊ฐ์ง) |
1๋ก ๋๋๋ ๊ฒฝ์ฐ 1+3+1+1 1๋ก ๋๋๋ ๊ฒฝ์ฐ๋ ์๊ฐํ ์ ์๋ค. ์๋๋ฉด +1์ ํด์ฃผ๋ฉด ์ฐ์์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. 2๋ก ๋๋๋ ๊ฒฝ์ฐ 2+1+2+1 3+2+1 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ 2+3 +1 |
์ฌ๊ธฐ์ dp[5]์์ ๊ฐ์ ธ์จ 4๊ฐ์ง์ ๊ฒฝ์ฐ์ ์๋, ๋ชจ๋ dp[6] ์์ [1]๋ก ๋๋๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋๊ณ , dp[6][1] = 3์ด ๋๋ค! |
4๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์ (2๋ฅผ ๋ํด์ฃผ์ด์ผ 6์ด ๋๋ค) |
1+2+1 1+3 3+1 (3๊ฐ์ง) |
1๋ก ๋๋๋ ๊ฒฝ์ฐ 1+2+1+2 3+1 +2 2๋ก ๋๋๋ ๊ฒฝ์ฐ x 2๋ก ๋๋๋ ๊ฒฝ์ฐ๋ ์๊ฐํ ์ ์๋ค. ์๋๋ฉด +2 ๋ฅผ ํด์ฃผ๋ฉด, ์ฐ์์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์นจ ํด๋น ๊ฒฝ์ฐ์๋ 2๋ก ๋๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธดํ๋ค. 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ 1+3 + 2 |
์ฌ๊ธฐ dp[4] ๋ก ๋ถํฐ ๊ฐ์ ธ์จ 3๊ฐ์ง์ ๊ฒฝ์ฐ๋, ๋ชจ๋ dp[6]์์๋ [2]๋ก ๋๋๋ ๊ฒฝ์ฐ์ ์๊ฐ ๋๋ค. ์ฆ, dp[6][2]=3 ์ด ๋๋ค! |
3์ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์ (3์ ๋ํด์ฃผ์ด์ผ 6์ด ๋๋ค) |
1+2 2+1 3 |
1๋ก ๋๋๋ ๊ฒฝ์ฐ 2+1+3 2๋ก ๋๋๋ ๊ฒฝ์ฐ 1+2+3 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ 3 +3 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ๋ ์๊ฐํ ์ ์๋ค. ์๋๋ฉด +3์ ํด์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. |
๋ง์ฐฌ๊ฐ์ง๋ก, dp[6][3] = 2 ๊ฐ ๋๋ค. |
์๋ฅผ ๋์ํ ํด๋ณด์.
- dp[6-1][1] = dp[6-1][2] + dp[6-1][3] (1๋ก ๋๋๋ ๊ฒฝ์ฐ = 2๋ก ๋๋๋ ๊ฒฝ์ฐ + 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ)
- dp[6-2][2] = dp[6-2][1] + dp[6-2][3] (2๋ก ๋๋๋ ๊ฒฝ์ฐ = 1๋ก ๋๋๋ ๊ฒฝ์ฐ + 3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ)
- dp[6-3][3] = dp[6-3][1] + dp[6-3][2] (3์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ = 1๋ก ๋๋๋ ๊ฒฝ์ฐ + 2๋ก ๋๋๋ ๊ฒฝ์ฐ)
์ด ๊ท์น์ ์์ค์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค.
์์ค์ฝ๋
๋ฐฐ์ด์ 0๋ถํฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์๊ฐํ ์ ์๊ฒ ๋ชจ๋ +1 ํ์ฌ ๋ฐฐ์ด์ ์์ฑํด์ฃผ์๋ค.
let n = Int(readLine()!)!
var dp = [[Int]](repeating: Array(repeating: 0, count: 4), count: 100001)
dp[1] = [0, 1, 0, 0]
dp[2] = [0, 0, 1, 0]
dp[3] = [0, 1, 1, 1]
for j in 4..<100001 {
dp[j][1] = dp[j-1][2]%1000000009 + dp[j-1][3]%1000000009
dp[j][2] = dp[j-2][1]%1000000009 + dp[j-2][3]%1000000009
dp[j][3] = dp[j-3][1]%1000000009 + dp[j-3][2]%1000000009
}
for _ in 1..<n+1 {
let i = Int(readLine()!)!
print((dp[i][1]+dp[i][2]+dp[i][3])%1000000009)
}
์ฌ๊ธฐ์ ์ ๊น, ์ print ํ๊ธฐ ์ด์ ์ 100001 ๊ฐ์ ๋ฐฐ์ด ๋ชจ๋ ์์ฑํด ๋๊ณ ์์ํ๋์ง ๊ถ๊ธํ ์ ์๋ค. ๊ทธ๋์ ๋๋ for๋ฌธ์ ์ด์ฉํด์ ์ ๋ ฅ๋๋ ์ซ์๋งํผ๋ง ๋ฐฐ์ด์ ์์ฑํ๊ฒ ๋ง๋ค์๋ค. ๊ทธ๋ฌ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฒ, dp[50]๋ฅผ ๊ตฌํ๊ณ , dp[100]์ ๊ตฌํ ๋, ๋ ๋๊ฐ์ ์ฐ์ฐ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ์ฐ์ฐ๋์ด +N ์ฉ ๋ ๋ค๊ธฐ ๋๋ฌธ์ ์ด๋ฐ์ 100001 ๊ธธ์ด์ ๋ฐฐ์ด์ ๋ชจ๋ ์์ฑํด ๋ ์ํ์์ ์ถ๋ ฅํ๋ ๊ฒ์ด ๋ ๋นจ๋๋๊ฒ์ด๋ค.