※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 16787번 문제인 マルバツスタンプ (Circle Cross Stamps)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/16787
16787번: マルバツスタンプ (Circle Cross Stamps)
JOI 君が印字したマークは,左から順に,マル,バツ,バツ,マル,バツである.JOI 君がマルスタンプ,バツスタンプ,マルバツスタンプをそれぞれ 0, 1, 2 個持っているとすると,以下の順
www.acmicpc.net
O와 X로 이루어진 주어지는 문자열에서 "OX" 또는 "XO"라는 부분문자열을 겹치지 않게 최대한 많이 고를 때의 그 개수를 구하는 문제이다.
XX 또는 OO와 같이 같은 문자가 연속으로 나온다면 해당 두 칸을 고르는 것은 답의 후보가 될 수 없으므로, 해당 부분들의 가운데를 기준으로 문자열들을 쪼갠 부분문제들을 해결하는 것으로 문제를 해결할 수 있다.
해당 부분문제들은 연속한 XX와 OO를 전부 쪼갠 뒤이므로 O와 X가 번갈아 등장하는 형태뿐이라는 점을 이용하자. 이 부분문제의 답이 (부분문자열의 길이) / 2(몫)임은 쉽게 알아낼 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int ans = 0;
int slen; string s; cin >> slen >> s;
int streak = 0; char old = '?';
for (auto& c : s) {
if (c == old) {
ans += streak / 2;
streak = 0;
}
streak++;
old = c;
}
ans += streak / 2;
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16788 // C++] 日本沈没 (Japan Sinks) (0) | 2022.09.04 |
---|---|
[BOJ 16785 // C++] ソーシャルゲーム (Social Game) (0) | 2022.09.03 |
[BOJ 16786 // C++] すごろくと駒 (Sugoroku and Pieces) (0) | 2022.09.01 |
[BOJ 18412 // C++] 文字列の反転 (Inversion of a String) (0) | 2022.08.31 |
[BOJ 21347 // C++] Keyboardd (0) | 2022.08.30 |