Swift Data Structure And Algorithm/Dynamic Programming

연속 λΆ€λΆ„ μ΅œλŒ€ν•© L

youngjaeLee1026 2022. 4. 12. 17:36

1. 문제

스크란샷 2022-04-12 17 31 49

2. μž…μΆœλ ₯

스크란샷 2022-04-12 17 32 03

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

스크란샷 2022-04-12 17 32 11

4. 문제 섀계

  • μœ„ λ¬Έμ œλŠ” 완전탐색, λΆ„ν•  정볡법 λ“±μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ§€λ§Œ, 문제의 크기가 1,000,000 μ΄λ―€λ‘œ 쑰금 더 효율적인 μ•Œκ³ λ¦¬μ¦˜μ„ 섀계해야 함
  • λ”°λΌμ„œ 각 μ›μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ”(였λ₯Έμͺ½ 끝으둜 생각) 연속 λΆ€λΆ„ 쀑 μ΅œλŒ€κ°’μ„ μ €μž₯ν•΄ λ‚˜κ°€λ©΄μ„œ λ§ˆμ§€λ§‰ μ›μ†ŒκΉŒμ§€ 이λ₯Ό κ²°μ •ν•˜κ³ ,
  • ν•΄λ‹Ή 값듀이 μ €μž₯λ˜μ–΄μžˆλŠ” λ°°μ—΄μ˜ μ΅œλŒ€κ°’μ„ 찾음으둜써 문제λ₯Ό ν•΄κ²°ν•  수 있음
  • μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Όν•  점은, κ°€μž₯ 끝에 μžˆλŠ” μ›μ†Œκ°€ μ΅œλŒ€κ°’μ΄λΌκ³  μƒκ°ν•˜κΈ° μ‰¬μš΄λ°, μ΄λŠ” 뒀에 μžˆλŠ” μ›μ†Œκ°€ μŒμˆ˜κ°€ λ‚˜μ˜¬ 경우 더 μž‘μ•„μ§ˆ 수 μžˆλŠ” 상황이 λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ, 각 μ›μ†Œλ₯Ό λμœΌλ‘œν•˜λŠ” 연속 λΆ€λΆ„ 쀑 μ΅œλŒ€κ°’μ„ 각각 ꡬ해놓고 κ·Έ 쀑에 μ΅œλŒ€κ°’μ„ 선택해야 μˆ˜μ—΄μ˜ 연속 λΆ€λΆ„ μ΅œλŒ€ν•©μ„ ꡬ할 수 있음
  • λ”°λΌμ„œ, T[i] = iλ₯Ό ν¬ν•¨ν•˜λŠ”(였λ₯Έμͺ½ 끝으둜 μƒκ°ν•˜λŠ”) 연속 λΆ€λΆ„ 쀑 μ΅œλŒ€κ°’μ΄λ©°,
  • T[i] = T[i] < T[i - 1] + T[i] ? T[i - 1] + T[i] : T[i] κ³Ό 같은 점화식을 μ„ΈμšΈ 수 있고, μ΅œμ’…μ μœΌλ‘œ Max(T[0] ~ T[n - 1])을 ꡬ해야 ν•˜λ―€λ‘œ, O(n)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - 연속 λΆ€λΆ„ μ΅œλŒ€ν•© L

//MARK: - Framework
import Foundation

//MARK: - Function
func solution() -> Void {
    //MARK: - Input
    guard let n: Int = Int(readLine() ?? "0") else { return }
    guard let inputArray: [String] = readLine()?.components(separatedBy: " ") else { return }
    
    let array: [Int] = inputArray.map { Int($0) ?? 0 }
    var table: [Int] = Array(repeating: 0, count: n)
    var result: Int = 0
    
    //MARK: - Process
    table[0] = array[0]
    result = table[0]
    
    for i in 1..<n {
        table[i] = array[i] < table[i - 1] + array[i] ? table[i - 1] + array[i] : array[i]
    }
    
    for number in table {
        result = result < number ? number : result
    }
    
    //MARK: - Output
    print(result)
}
solution()

 

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