Swift Data Structure And Algorithm/Divide&Conquer Algorithm

์—ฐ์† ๋ถ€๋ถ„ ์ตœ๋Œ€ํ•ฉ

youngjaeLee1026 2022. 4. 7. 20:06

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-07 20 05 03

2. ์ž…์ถœ๋ ฅ

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

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

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-07 20 05 17

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

  • ์œ„ ๋ฌธ์ œ๋ฅผ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋ ๊ฒฝ์šฐ O(n^2)์œผ๋กœ ๊ตฌ๊ฐ„์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๊ณ  ๊ตฌ๊ฐ„๋งˆ๋‹ค ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•ด์•ผํ•˜๋ฏ€๋กœ, ์ด O(n^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž„
  • ์œ„ ์™„์ „ํƒ์ƒ‰์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์„ ํ•ฉ์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋†“์Œ์œผ๋กœ์จ O(1)๋กœ ์ค„์—ฌ ์ด O(n^2)์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ด๋‹น ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋Š” 100,000์ด๋ฏ€๋กœ ํ•ด๋‹น ์‹œ๊ฐ„๋ณต์žก๋„๋„ ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹˜
  • ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„ ๋ฌธ์ œ๋„ ์ž๊ธฐ ์ž์‹  ์†์— ์ตœ๋Œ€ํ•ฉ์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์žฌ๊ท€ํ˜ธ์ถœ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์ฆ‰, ๋ถ„ํ•  ์ •๋ณต๋ฒ•์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™ผ์ชฝ ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€ํ•ฉ, ์˜ค๋ฅธ์ชฝ ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•˜๊ณ , ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จํ•œ ์™ผ์ชฝ ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€ํ•ฉ, ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จํ•œ ์˜ค๋ฅธ์ชฝ ๊ตฌ๊ฐ„์˜ ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•ด ์ด ๋‘˜์„ ๋”ํ•จ์œผ๋กœ์จ ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จํ•œ ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ณ , ์œ„ ์…‹์˜ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ถ„ํ•  ์ •๋ณต๋ฒ•์„ ํ†ตํ•ด ๊ฒฝ๊ณ„๋ฅผ ํฌํ•จํ•œ ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์‹œ๊ฐ„๋ณต์žก๋„๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ด O(n log n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

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

//MARK: - ์—ฐ์† ๋ถ€๋ถ„ ์ตœ๋Œ€ํ•ฉ

//MARK: - Framework
import Foundation

//MARK: - Function
func getSubMax(_ array: [Int], _ start: Int, _ end: Int) -> Int {
    //array์˜ start ๋ถ€ํ„ฐ end ๊นŒ์ง€์˜ ์—ฐ์† ๋ถ€๋ถ„ ์ตœ๋Œ€ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
    if start >= end {
        return array[start]
    }
    
    let mid: Int = (start + end) / 2
    let leftSubMax: Int = getSubMax(array, start, mid)
    let rightSubMax: Int = getSubMax(array, mid + 1, end)
    
    var leftSum, leftMax, rightSum, rightMax, middleSubMax: Int
    leftSum = 0
    leftMax = -987987987
    rightSum = 0
    rightMax = -987987987
    
    for i in stride(from: mid, through: start, by: -1) {
        leftSum += array[i]
        
        leftMax = leftMax < leftSum ? leftSum : leftMax
    }
    
    for i in mid + 1...end {
        rightSum += array[i]
        
        rightMax = rightMax < rightSum ? rightSum : rightMax
    }

    middleSubMax = leftMax + rightMax
    
    if leftSubMax > rightSubMax && leftSubMax > middleSubMax {
        return leftSubMax
    } else if rightSubMax > leftSubMax && rightSubMax > middleSubMax {
        return rightSubMax
    } else {
        return middleSubMax
    }
}

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 result: Int = 0
    
    //MARK: - Process
    result = getSubMax(array, 0, n - 1)
    
    //MARK: - Output
    print(result)
}
solution()

 

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