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

 

이번에 볼 문제는 백준 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

+ Recent posts