※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |