Swift Data Structure And Algorithm/Dynamic Programming

λ²„νŠΌ λˆ„λ₯΄κΈ°

youngjaeLee1026 2022. 4. 8. 21:15

1. 문제

스크란샷 2022-04-08 21 11 30

2. μž…μΆœλ ₯

스크란샷 2022-04-08 21 11 39

3. μž…μΆœλ ₯ μ˜ˆμ‹œ

스크란샷 2022-04-08 21 11 51

4. 문제 섀계

  • N이 100,000이기 λ•Œλ¬Έμ— O(N^2) μ™„μ „νƒμƒ‰μœΌλ‘œ 문제λ₯Ό μ‹œκ°„μ•ˆμ— ν•΄κ²°ν•  수 없을 λΏλ”λŸ¬, 이전에 μ„ νƒν–ˆλ˜ λ²„νŠΌμ„ λ‹€μŒ μ°¨λ‘€μ—μ„œ μ„ νƒν•˜μ§€ μ•Šκ³ , ν˜„μž¬ 차둀에 μ„ νƒν•œ λ²„νŠΌμ€ λ‹€μŒ μ°¨λ‘€μ—μ„œ 선택할 수 μ—†κ³  이전 μ°¨λ‘€λŠ” λ‹€μŒ μ°¨λ‘€μ—μ„œ 선택할 수 μžˆλŠ” νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜κΈ°λ„ κΉŒλ‹€λ‘œμ›€
  • λ”°λΌμ„œ ν˜„μž¬ μ‹œμ μ„ κΈ°μ€€μœΌλ‘œ 이전 μ‹œμ μ„ 바라봀을 λ•Œ, ν˜„μž¬ λ²„νŠΌμ„ μ„ νƒν•˜κ²Œ 되면 이전 λ²„νŠΌμ—μ„œ ν˜„μž¬ λ²„νŠΌμ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 2λ²„νŠΌ 쀑 μ΅œλŒ€ 값을 ν˜„μž¬ λ²„νŠΌ 값에 λ”ν•˜λŠ” νŒ¨ν„΄μ„ 찾을 수 있고, 즉 μ΄λŸ¬ν•œ 과정을 N개의 μ‹œκ°„μ— λŒ€ν•΄ λ°˜λ³΅ν•˜κ²Œ λ˜λ―€λ‘œ
  • μž‘μ€ 문제λ₯Ό ν•΄κ²°ν•˜μ—¬ 큰 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 동적 κ³„νšλ²•μ„ μ‚¬μš©ν•  수 있음
  • μœ„ 과정을 λ°˜λ³΅ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ Nμ΄ˆμ— ν•΄λ‹Ή ν•˜λŠ” κ°’ 쀑 μ΅œλŒ€κ°’μ„ 찾음으둜써 문제λ₯Ό ν•΄κ²°ν•˜λ―€λ‘œ O(N)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - λ²„νŠΌ λˆ„λ₯΄κΈ°

//MARK: - Framework
import Foundation

//MARK: - Function
func getMax(_ array: [[Int]], _ baseCondition: Int, _ N: Int) -> Int {
    var result: Int = 0
    
    for i in 0..<baseCondition {
        result = result < array[N - 1][i] ? array[N - 1][i] : result
    }
    
    return result
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    let baseCondition: Int = 3
    var result: Int = 0
    var buttonValues: [[Int]] = []
    
    for _ in 0..<N {
        guard let inputData: [String] = readLine()?.components(separatedBy: " ") else { return }
        buttonValues.append(inputData.map { Int($0) ?? 0 })
    }
    
    //MARK: - Process
    //1. λΆ€λΆ„ 문제λ₯Ό μ •μ˜ν•œλ‹€.
    //max(T[N - 1][0], T[N - 1][1], T[N - 1][2) = 각 μ΄ˆλ§ˆλ‹€ 이전 μ‹œμ μ—μ„œ μ„ νƒν•œ λ²„νŠΌμ„ μ œμ™Έν•œ λ²„νŠΌμ„ μ„ νƒν–ˆμ„ λ•Œ λˆ„μ ν•©μ˜ μ΅œλŒ€κ°’
    
    //2. 점화식을 μ„Έμš΄λ‹€.
    //T[i][0] += T[i - 1][1] < T[i - 1][2] ? T[i - 1][2] : T[i - 1][1]
    //T[i][1] += T[i - 1][0] < T[i - 1][2] ? T[i - 1][2] : T[i - 1][0]
    //T[i][2] += T[i - 1][0] < T[i - 1][1] ? T[i - 1][1] : T[i - 1][0]
    //...T[N - 1][0], T[N - 1][1], T[N - 1][2] κΉŒμ§€
    //max(T[N - 1][0], T[N - 1][1], T[N - 1][2)
    for i in stride(from: 1, to: N, by: 1) {
        buttonValues[i][0] += buttonValues[i - 1][1] < buttonValues[i - 1][2] ? buttonValues[i - 1][2] : buttonValues[i - 1][1]
        buttonValues[i][1] += buttonValues[i - 1][0] < buttonValues[i - 1][2] ? buttonValues[i - 1][2] : buttonValues[i - 1][0]
        buttonValues[i][2] += buttonValues[i - 1][1] < buttonValues[i - 1][0] ? buttonValues[i - 1][0] : buttonValues[i - 1][1]
    }
    
    result = getMax(buttonValues, baseCondition, N)
    
    //MARK: - Output
    print(result)
}
solution()

 

μ „μ²΄μ½”λ“œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.