Swift Data Structure And Algorithm/Dynamic Programming

์ˆซ์ž ๋งŒ๋“ค๊ธฐ

youngjaeLee1026 2022. 4. 8. 21:13

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-08 21 09 07

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-08 21 09 15

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-08 21 09 27

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()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.