Swift Data Structure And Algorithm/Dynamic Programming

์นด๋“œ ๋†€์ด

youngjaeLee1026 2022. 4. 8. 21:15

1. ๋ฌธ์ œ

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

2. ์ž…์ถœ๋ ฅ

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

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

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

4. ๋ฌธ์ œ ์„ค๊ณ„

  • ์—ฐ์†ํ•˜์—ฌ 3๊ฐœ์˜ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” 3๊ฐ€์ง€๋กœ ๋‚˜๋‰จ
  • 1. ํ˜„์žฌ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • 2. ํ˜„์žฌ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ด์ „ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • 3. ํ˜„์žฌ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ด์ „ ์นด๋“œ๋„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒฝ์šฐ
  • ์œ„ 3๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ตœ๋Œ€๊ฐ’์„ ๊ฐ๊ฐ ์ €์žฅํ•ด๋†“๊ณ  ์ตœ์ข…์ ์œผ๋กœ 3๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์Œ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ˜„์žฌ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด์ „ ์นด๋“œ์— ๋Œ€ํ•œ ์œ„ 3๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ€๊ฐ’์„ ์ €์žฅํ•ด์•ผํ•จ
  • ํ˜„์žฌ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€๊ณ  ์ด์ „ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ ์นด๋“œ์˜ ๊ฐ’์— ์ด์ „ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๊ฐ’์„ ์ €์žฅ
  • ํ˜„์žฌ ์นด๋“œ์™€ ์ด์ „ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ํ˜„์žฌ ์นด๋“œ์˜ ๊ฐ’์— ์ด์ „ ์นด๋“œ๋งŒ ๊ฐ€์ ธ๊ฐ”์„ ๋•Œ์˜ ๊ฐ’์„ ์ €์žฅ
  • ์œ„ ๊ณผ์ •์„ N๊ฐœ์˜ ์นด๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ ํ›„ 3๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ

5. ์ „์ฒด ์ฝ”๋“œ

//MARK: - ์นด๋“œ ๋†€์ด

//MARK: - Framework
import Foundation

//MARK: - Function
func getMax(_ array: [Int]) -> Int {
    var result: Int = 0
    for number in array {
        result = result < number ? number : result
    }
    
    return result
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    guard let inputArray: [String] = readLine()?.components(separatedBy: " ") else { return }
    
    let baseCondition: Int = 3
    var result: Int = 0
    let cards: [Int] = inputArray.map { Int($0) ?? 0 }
    var cases: [Int] = Array(repeating: 0, count: baseCondition)
    
    //MARK: - Process
    //1. ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•œ๋‹ค.
    //max(T[0], T[1], T[2]) = ์ฃผ์–ด์ง„ ์นด๋“œ์—์„œ ์—ฐ์†ํ•ด์„œ ์ตœ๋Œ€ 2์žฅ์”ฉ ๋ฝ‘์•˜์„ ๋•Œ, ์ตœ๋Œ€๊ฐ’
    
    //2. ์ ํ™”์‹์„ ์„ธ์šด๋‹ค.
    //T[0] = i๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋ฝ‘์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ด์ „ ๊ฒฝ์šฐ์—์„œ ์ตœ๋Œ€๊ฐ’
    //T[1] = i๋ฒˆ์งธ ์นด๋“œ๋งŒ ๋ฝ‘์€ ๊ฒฝ์šฐ
    //T[2] = i๋ฒˆ์งธ ์นด๋“œ + i - 1๋ฒˆ์งธ ์นด๋“œ ๋‘์žฅ์„ ๋ฝ‘์€ ๊ฒฝ์šฐ
    //max(T[0], T[1], T[2])
    cases[0] = 0
    cases[1] = cards[0]
    cases[2] = cases[0] + cards[0]
    
    for i in 1..<N {
        let choiceNoting, choiceOne, choiceTwo: Int
        choiceNoting = getMax(cases)
        choiceOne = cards[i] + cases[0]
        choiceTwo = cards[i] + cases[1]
        
        
        cases[0] = choiceNoting
        cases[1] = choiceOne
        cases[2] = choiceTwo
    }
    
    result = getMax(cases)
    
    //MARK: - Output
    print(result)
}
solution()

 

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