1. ๋ฌธ์
2. ์ ์ถ๋ ฅ
3. ์ ์ถ๋ ฅ ์์
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()
์ ์ฒด์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.