※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 26862번 문제인 Maxdifficent Group이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/26862

 

배열을 여러 구간으로 나눴을 때, 어떤 인접한 두 구간의 값의 차가 가장 큰 둘을 남겨두고 다른 부분은 아무렇게나 나누어도 있어도 값의 차의 최댓값이 줄어들지는 않음을 관찰하자. 따라서 전체 구간을 나누는 것을 고려할 필요 없이, 인접한 두 구간의 수의 차가 최대가 되게끔 하는 두 구간을 찾는 것으로 문제를 해결할 수 있다.

 

어떤 수를 기준으로 인덱스가 감소하는(왼쪽) 방향으로 연속하는 수의 합 중 최대 및 최솟값이 무엇인지, 오른쪽으로는 어떤지를 구하고, 해당 값을 이용해 두 구간이 인접하고 있을 수 있는 모든 위치에 대하여 그곳에서 두 구간이 인접할 때의 값의 최댓값을 모두 살펴 문제를 해결하자. Kadane's algorithm을 이용해 빠르게 필요한 전처리를 할 수 있다.

 

아래는 제출한 소스코드이다.

//kadane's algorithm
#include <iostream>
using namespace std;
typedef long long ll;

int N;
ll A[100000];
ll mxL[100000], mnL[100000], mxR[100000], mnR[100000];
ll ans = -1000000000000000000LL;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) cin >> A[i];
	for (ll i = 0, val = 0; i < N; i++) {
		val += A[i];
		mxL[i] = val;
		if (val < 0) val = 0;
	}
	for (ll i = 0, val = 0; i < N; i++) {
		val += A[i];
		mnL[i] = val;
		if (val > 0) val = 0;
	}
	for (ll i = N - 1, val = 0; i > -1; i--) {
		val += A[i];
		mxR[i] = val;
		if (val < 0) val = 0;
	}
	for (ll i = N - 1, val = 0; i > -1; i--) {
		val += A[i];
		mnR[i] = val;
		if (val > 0) val = 0;
	}

	for (int i = 0; i + 1 < N; i++) {
		ans = max(ans, mxL[i] - mnR[i + 1]);
		ans = max(ans, mxR[i + 1] - mnL[i]);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 14943 // C++] 벼룩 시장  (0) 2024.07.28
[BOJ 31115 // C++] Graph Theory  (0) 2024.07.27
[BOJ 32046 // C++] Snacks within 300 Yen  (0) 2024.07.25
[BOJ 16450 // C++] Interruptores  (2) 2024.07.24
[BOJ 23352 // C++] 방탈출  (4) 2024.07.23

+ Recent posts