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

 

이번에 볼 문제는 백준 11059번 문제인 크리 문자열이다.
문제는 아래 링크를 확인하자.

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

 

11059번: 크리 문자열

첫째 줄에 문자열 S가 주어진다. S는 숫자로만 이루어져 있으며, 길이는 1,000을 넘지 않는다. 항상 크리 문자열이 존재하는 입력만 주어진다.

www.acmicpc.net

모든 길이 2K의 문자열은 중심에 두 문자가 있다. 이 두 문자의 인덱스를 L과 R이라 하자. 이러한 L과 R의 쌍은 2K-1개 존재한다.

 

각 L과 R의 쌍에 대하여 문자열의 범위를 넘어서기 전까지 L을 1씩 줄이고 R을 1씩 늘리며 왼쪽 수들의 합과 오른쪽 수들의 합이 같은지를 체크 및 답 갱신을 반복해 문제를 해결하자. 이 과정에서 L과 R이 1씩 변한 뒤의 왼쪽 수들의 합과 오른쪽 수들의 합은 이전 단계의 값들에서 새 인덱스의 수들을 더하는 것으로 빠르게 갱신해나갈 수 있음을 확인하자. 이와 같은 최적화를 하지 않아도 이 문제를 해결하는 데에는 지장이 없긴 하다.

 

L과 R을 조정하는 횟수는 많아야 K회 이하이고 주어지는 문자열의 길이는 1000 이하이므로 위와 같은 방법으로 문제를 충분히 해결할 수 있다.

 

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

#include <iostream>
#include <string>
using namespace std;

int N;
string s;
int ans;

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

	cin >> s; N = s.length();
	for (int i = 1; i < N; i++) {
		int L = i - 1, R = i;
		int sumL = 0, sumR = 0;

		while (L > -1 && R < N) {
			sumL += s[L] - '0', sumR += s[R] - '0';
			if (sumL == sumR) ans = max(ans, R - L + 1);
			L--, R++;
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 4649 // C++] Tanning Salon  (0) 2023.12.23
[BOJ 4335 // C++] 숫자 맞추기  (1) 2023.12.22
[BOJ 20052 // C++] 괄호 문자열 ?  (0) 2023.12.20
[BOJ 13339 // C++] XOR 수열  (1) 2023.12.19
[BOJ 11292 // C++] 키 큰 사람  (1) 2023.12.18

+ Recent posts