0과 1들의 그룹수를 계산하면 되는 문제이다.
전에 코테에서 이 문제의 어려운 버전을 풀어본 적이 있다. 그때는 각 그룹 별로 몇 개의 수가 있는지까지 계산해야 해서 조금 복잡하기도 했고 마지막을 잘 처리하지 못해 테케를 몇 개 통과하지 못했었다.
이런 문제를 풀 때는 바로 앞의 값과 비교해 다른 경우에만 count하고 flag 다시 설정하는 방식으로 풀면 된다. 그리고 시작과 마지막 예외처리 해주기!
#include <iostream>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string S;
int i, size;
int one_group = 0, zero_group = 0;
bool is_one = false;
cin >> S;
size = S.size();
if (S[0] == '1') is_one = true;
for (i = 1; i < size; i++) {
if (S[i] != S[i - 1]) {
if (is_one) one_group++;
else zero_group++;
is_one = !is_one;
}
}
if (S[size - 1] == '0' && !is_one) zero_group++;
else if (S[size - 1] == '1' && is_one) one_group++;
cout << ((zero_group < one_group) ? zero_group : one_group) << endl;
return 0;
}