21758 꿀 따기

먼저 꿀을 따는 방식은 크게 3가지가 존재하는데 이 부분을 구하지 못해 풀지 못했다.

```
3가지의 케이스는 다음과 같다.
1. 왼쪽끝 벌, 오른쪽 끝 벌통, 나머지 벌 위치 잡으면서 최대값
2. 오른쪽 끝 벌, 왼쪽 끝 벌통, 나머지 벌 위치 잡으면서 최대값
3. 왼쪽, 오른쪽 모두 벌, 가운데 벌통 위치 잡으면서 최대값을 갱신해가면 됨
이때 미리 누적합을 구해두고 벌의 위치만 빼주면 최대값을 구할 수 있다.
```

따라서 위의 각 케이스를 구해주기 위해선 먼저 전체의 각 인덱스마다의 구간의 합을 구해주어야 한다. 왼쪽 → 오르쪽으로 가는 구간합을 구한 배열이 int[] sum, 각 인덱스의 값을 담은 배열이 int[] arr일때 다음과같이 1, 2, 3을 구할 수 있다.

1. **왼쪽 끝이 `벌`, 오른쪽 끝이 `벌통`, 나머지 벌의 위치는 둘 사이에서 임의의 위치라면**
    - 왼쪽 끝 벌이 딸 수 있는 최대 값 = n까지의 구간합 - 왼쪽 끝의 값 - 임의로 움직이는 벌의 값
    - 임의의 벌이 딸 수 있는 최대 값 = n까지의 구간합 - 임의의 벌의 위치의 구간합

**코드: `max = Math.max(max, sum[n - 1] - arr[0] - arr[i] + sum[n - 1] - sum[i]);`**

따라서 2가지에 대한 값을 더해가며 최대값을 갱신한다.

1.  **왼쪽 끝이 `벌통`, 오른쪽 끝이 `벌`이고, 나머지 벌의 위치는 둘 사이 임의의 위치라면**
    - 우측 끝 벌의 최대 값 = n까지의 구간합 - 인덱스 n의 값 - 임의로 움직이는 벌의 값
    - 임의로 움직이는 벌의 값 = (임의의 벌 위치 - 1) 의 구간합

**코드:  `max = Math.max(max, sum[n - 1] - arr[n - 1] - arr[i] + sum[i - 1]);`**

따라서 2가지에 대한 값을 더해가며 최대값을 갱신한다.

1. **왼쪽, 오른쪽 끝이 `벌` 이고, `벌통`이 움직인다면**
    - 왼쪽 벌의 값:  벌통의 임의의 위치까지의 구간합 - 왼쪽 끝의 배열 값
    - 우측의 벌의 값: n까지의 구간 합 - n번째 배열값 - 임의의 벌통 - 1까지의 구간합

따라서 2가지에 대한 값을 더해가며 최대값을 갱신한다.

**코드: `max = Math.max(max, sum[i] - arr[0] + sum[n - 1] - arr[n - 1] - sum[i - 1]);`**

위 3가지를 전부 돌며 최대 값을 구하고 출력하면 됨

2798 블랙잭