1. ๋ฌธ์
2. ์ ์ถ๋ ฅ
3. ์ ์ถ๋ ฅ ์์
4. ๋ฌธ์ ์ค๊ณ
- ์์ ํ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฝ์ฐ O(N^2)๋ง ๋๋๋ผ๋ N์ด 100,000์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ์์ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํจ
- ๋ฐ๋ผ์, ๋ค๋ฅธ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๊ณ ํด์ผ ํ๋๋ฐ, ์ ๋ฌธ์ ์์ ๋์ 1์ด ๋ํด์ง๋ ๊ฒฝ์ฐ, 2๊ฐ ๋ํด์ง๋ ๊ฒฝ์ฐ 3์ด ๋ํด์ง๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด๋ฉด N = 4์ผ ๋, 3์ ๋ง๋๋ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ + 1์ ํด์ฃผ๋ฉด 4๊ฐ ๋๊ณ , 2๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ๊ฐ๊ฐ + 2๋ฅผ ํด์ฃผ๋ฉด 4๊ฐ ๋๊ณ , 1์ ๋ง๋๋ ๊ฒฝ์ฐ์ + 3์ ํด์ค ํ ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๋ํ๊ฒ ๋๋ฉด 4๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์์
- ์ฆ, "๋"๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์์ "๋"๋ฅผ ์ด์ฉํ๋ ํจํด์ผ๋ก ๋์ ๊ณํ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์
- T[i] = 1, 2, 3์ ํฉ์ผ๋ก i๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์, T[1] = 1, T[2] = 2, T[3] = 4๊ฐ ๊ธฐ์ ์กฐ๊ฑด์ด๊ณ ,
- T[4] ๋ถํฐ๋ ์์ 3๊ฐ์ ์๋ฌธ์ ์ ํฉ์ ํตํด ์์ ์ ๊ตฌํ ์ ์์ผ๋ฏ๋ก O(N)์ ์๊ฐ๋ณต์ก๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์
5. ์ ์ฒด ์ฝ๋
//MARK: - ์ซ์ ๋ง๋ค๊ธฐ
//MARK: - Framework
import Foundation
//MARK: - Function
func solution() -> Void {
//MARK: - Input
guard let N: Int = Int(readLine() ?? "0") else { return }
let baseCondition: Int = 3
var sum: Int = 0
var table: [Int] = Array(repeating: 0, count: N + 10)
//MARK: - Process
//1. ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ ์
//T[i] = 1, 2, 3์ ์ฌ์ฉํ์ฌ i์ ๋ง๋๋ ์ด ๊ฒฝ์ฐ์ ์
//๊ฐ์ ์ซ์๋ฅผ ์ค๋ณตํ์ฌ ์ฌ์ฉํ ์ ์์
//2. ์ ํ์์ ์ธ์ด๋ค.
//T[0] = ๋ถ๊ฐ๋ฅ
//T[1] = 1, T[2] = T[1] + 1, T[3] = T[2] + T[1] + 1 -> Base Condition
//T[4] = T[3] + T[2] + T[1]
//T[i] = T[i - 3] + T[i - 2] + T[i - 1]
table[1] = 1
for i in 2...baseCondition {
sum += table[i - 1]
table[i] = sum + 1
}
for i in stride(from: baseCondition + 1, through: N, by: 1) {
table[i] = (table[i - 3] + table[i - 2] + table[i - 1]) % 1000007
}
//MARK: - Output
print(table[N])
}
solution()
์ ์ฒด์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
'Swift Data Structure And Algorithm > Dynamic Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ง์ฌ๊ฐํ๋ฐฐ์น์๊ฒฝ์ฐ์์ (0) | 2022.04.08 |
---|---|
๋ฒํผ ๋๋ฅด๊ธฐ (0) | 2022.04.08 |
์นด๋ ๋์ด (0) | 2022.04.08 |
๊ตฌ์ฌ ๊ฒ์ (0) | 2022.04.08 |
์ง์ฌ๊ฐํ์ ํฉ (0) | 2022.04.08 |