๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/9095
๋ด๊ฐ ํผ ํ์ด - ๋ง์์ต๋๋ค!
dp ๋ฌธ์ ๋ฅผ ์ธ ๋ฒ์งธ ํธ๋ ๊ฒ์ด์ง๋ง, ๊ฐ์ ์์ง ์ก์ง ๋ชปํ๋ฐ. (๋ฐ๋ณธ๊ฐ) ๊ทธ๋์ ํ์ด๋ฅผ ์ฐพ์๋ณด๋ ์ค, dp ๋ฌธ์ ๋ ๊ท์น์ ์ฐพ์๋ด๋ ๊ฑฐ์ฑ ํต์ฌ ํฌ์ธํธ๊ฐ ๋๋ค๋ ์ ์ ์๊ฒ ๋์๋ค. dp ๋ฌธ์ ํน์ฑ์, ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๊ฐ ๋ง๊ณ , memoization ํด๋์ ๋ฐ๋ก ์ง์ ์ ์์ด์ ๋ํด์ ๊ฐ์ ์ฐพ์๋ด๋ ๋ฌธ์ ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ด๊ฐ ํด๋น ๋ฌธ์ ๋ฅผ ํ์ดํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. *(ํ๊ธฐ์ ์ค๋ฅ๊ฐ ์์ด์ ์์ ํ์ด๋ค ํํ)
์ด๋ ๊ฒ ์ผ๋จ 1 ๋ถํฐ ์ญ ๊ฒฝ์ฐ์ ์๋ฅผ ์ดํด๋ณด๋ฉด, dp[n] = dp[n-1] + dp[n-2] + dp[n-3] ์ด๋ผ๋ ๊ท์น์ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ dp[0], dp[1], dp[2], dp[3] ๊น์ง ์์์ ์ซ์๋ฅผ ๋ฃ์ด์ค ๋ค, 4 ๋ถํฐ๋ ํด๋น ์์์ ๋ง๊ฒ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค.
let n = Int(readLine()!)!
for _ in 0..<n {
let num = Int(readLine()!)!
var dp = [Int](repeating: 0, count: num+1)
if num == 1 {
print(1)
} else if num == 2 {
print(2)
} else if num == 3 {
print(4)
} else {
dp[1] = 1
dp[2] = 2
dp[3] = 4
for i in 4..<num+1 {
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
}
print(dp[num])
}
}
dp ๋ฌธ์ ๋ ์ฐ์ ๋ฑ๋ณด๋ฉด "์, dp ๊ตฌ๋" ๋ฅผ ์์ ๋๋ก ์ฐ์ต์ด ํ์ํ ๊ฒ ๊ฐ๋ค. dp ์์ ๋ฐ๊ฒฌํ๋ ์๊ฐ, ๋ฌธ์ ๋ฅผ ํ์ดํ๋ ๋ฐฉ์์ ๋ํด์๋ ๊ฑฐ์ ๋๋ถ๋ถ ๋์ผํ๊ฒ ํ์ด๋๋ฏ๋ก, ์ญ์ ๋ฌธ์ ๋ ๋ง์ด ํ์ด๋ณด๊ณ ๊ฐ์ ์ตํ๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ dp ๋ฌธ์ ๋ฅผ ์ ํ์ ๋๋ ๊ท์น์ ๋จผ์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํด๋ณด์!