๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/11726
๋ด๊ฐ ํผ ํ์ด
์ฒ์์๋ ์ด๊ฒ ์ ๋์ ๊ณํ๋ฒ์ธ์ง ๋ชฐ๋๋ค. ์ธํฐ๋ท์ ๋์ถฉ ์ฐธ๊ณ ํด๋ณด๋, ํ์ผ๋ง ๊ฐฏ์๊ฐ ๋์ด๋๋ ๊ท์น์ด ํผ๋ณด๋์น์ ๋ฎ์์๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ๋ฉด ์ฝ๊ฒ ํ๋ฆด ์ ์๋ค๊ณ ํ๋ค.
์ ๋ง, ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉฐ ํ์ด๊ณผ์ ์ ์๊ฐํด๋ณด๋ ์ผ์ ํ ๊ท์น๋๋ก, ํผ๋ณด๋์น ์์ด์ ํํ๋ก ์ซ์๊ฐ ์ฆ๊ฐํจ์ ์ ์ ์์๋ค. ๊ทธ๋์ bottom up ๋ฐฉ์์ผ๋ก for ๋ฌธ์ ์ด์ฉํ์ฌ ํ์๋ค.
- dp ๋ฌธ์ ์์ ๊ธฐ์ตํ ๊ฒ์, dp ๋ฐฐ์ด์ ํญ์, ๊ฒฝ์ฐ์ ์๊ฐ ๋ค์ด๊ฐ๋ค. dp[9] ์ด๋ฉด 9๋ฒ ์์น์ผ๋์ ๊ฒฝ์ฐ์ ์๊ฐ value ๋ก ๋ค์ด๊ฐ๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฌธ์ ์์๋ dp[1]์ผ ๊ฒฝ์ฐ, 2x9 ํ์ผ์ผ ๋ ํ์ผ๋ง ๊ฒฝ์ฐ์ ์๊ฐ ๋ฐฐ์ด๋ก ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ด๋ค.
- ํด๋น ๋ฌธ์ ๋ ํผ๋ณด๋์น ์์ด์ ํํ๋ฅผ ๋๋ค. ์๋ ๊ทธ๋ฆผ์ ๋ณด์.
์ด๋ ๊ฒ ํผ๋ณด๋์น ์์ด๋ก 9๊น์ง ๊ณ์ฐํด๋ณด๋ฉด, 55๊ฐ ๋๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ ๋ฐฑ์ค์์ ์ฃผ์ด์ง ์์ ์ธํ-์์ ์ถ๋ ฅ๊ณผ ์ผ์นํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด ๊ท์น์ ํ ๋๋ก ์ฝ๋๋ก ์์ฑํ๋ค!
ํผ๋ณด๋์น๋ฅผ dp ๋ก ๊ตฌํํ๋ ๋ฐฉ์์ ์ด ํฌ์คํ ์ ๋ณด๊ธธ ๋ฐ๋๋ค.
์ฒซ๋ฒ์งธ ํ์ด - ๋ฐํ์ ์๋ฌ
let n = Int(readLine()!)!
var dp = [Int](repeating: 0, count: n+1)
dp[1] = 1
dp[2] = 2
for i in stride(from: 3, through: n, by: 1) {
dp[i] = (dp[i-1] + dp[i-2]) % 10007
}
print(dp[n])
๋๋ฒ์งธ ํ์ด - ๋ง์์ต๋๋ค!
๋ฐฑ์ค์์ ๋ฐํ์ ์๋ฌ๋ ์์์น ๋ชปํ๊ฒ ์ค๊ฐ์ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ ์ค๋จ๋์๊น? ๋ถ๋ช ์ด๋ ํ ์คํธ ์ผ์ด์ค์์ ์ ํํ ์ ๋ต์ ์ถ๋ ฅํ์ง ๋ชปํ๊ณ , ์ค๋จ ๋์ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด๋์ค, ์ฒซ๋ฒ์งธ ํ์ด ์ฒ๋ผ ์์ฑํ๊ฒ ๋๋ฉด, n์ด 1์ผ ๋, dp[i] = dp[i-1] + dp[i-2] ์ด ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ฐพ์๋๋ค. ๊ทธ๋์ ๊ณ ์ ๊ฐ์ผ๋ก ๋ฃ์ด๋๋ dp[1] ๊ณผ dp[2]์ ๋ํ ์ถ๋ ฅ์ ๋ํด์ if ๋ฌธ์ ํ์ฉํ์ฌ ๋ฐ๋ก ์์ฑํด์ฃผ์๋ค.
let n = Int(readLine()!)!
var dp = [Int](repeating: 0, count: n+1)
if n == 1 {
print(1)
} else if n == 2 {
print(2)
} else {
dp[1] = 1
dp[2] = 2
for i in 3..<n+1 {
dp[i] = (dp[i-1] + dp[i-2]) % 10007
}
print(dp[n])
}