그리디는 직관적으로 문제를 이해해야 해서 너무 어려운것 같다..

3가지의 경우가 있다.

그전에 먼저 조건

  • 왼쪽에 있는 벌을 b1
  • 오른쪽에 있는 벌을 b2
  • 벌통을 pivot

위와 같이 정의하고

두번째 벌통부터 끝에서 두번째 벌통까지 순회한다.

각 방문하는 벌통에 대해서

  • 해당 벌통이 pivot 즉 b1 -> pviot <- b2 와 같은 상황
  • 해당 벌통이 b2 이때 b1은 자연스럽게 맨 왼쪽 벌통, pivot은 맨 오른쪽 벌통 b1 -> b2 -> pivot
  • 해당 벌통이 b1 이때 b2는 자연스럽게 맨 오른쪽 벌통, pivote은 맨 왼쪽 벌통 pivot <- b1 <- b2
import Foundation

let n = Int(readLine()!)!
let baskets: [Int] = [0] + readLine()!.split(separator: " ").map { Int(String($0))! }
var sums: [Int] = baskets
var answer = 0

(1...n).forEach { sums[$0] += sums[$0 - 1] }

func beeSum(l: Int, r: Int) -> Int {
    return sums[r] - sums[l-1]
}

(2..<n).forEach { i in
    answer = max(answer, beeSum(l: 2, r: i) + beeSum(l: i, r: n-1)) // --> p <--
    answer = max(answer, beeSum(l: 2, r: n) + beeSum(l: i+1, r: n) - baskets[i]) // --> --> p
    answer = max(answer, beeSum(l: 1, r: n-1) + beeSum(l: 1, r: i-1) - baskets[i]) // p <-- <--
}

print(answer)

참고 : https://www.acmicpc.net/problem/21758