출처:https://www.acmicpc.net/problem/1439
이 문제는 모든 경우를 뒤집어보는 브루트포스를 이용하려면 이중For을 이용해야하는데, S가 100만이므로 O(N^2)은 사용할 수가 없다. 즉, 다른 방법을 이용해서 최소한의 횟수를 찾아내야한다.
문제를 보면, 결국은 앞면 /뒷면 2가지경우의 수 이므로, 연속된 "0"의 갯수와 연속된 1의 갯수의 묶음 중, 작은걸 출력하면 된다. 뒤집고 , 또 뒤집는 경우는 어쨋든 한번의 행위가 더 들어가므로, 처음부터 최소한으로 뒤집는것이 Best Practice이다.
만약, s[i]와 s[i+1]이 다르면서, s[i]가 '0'이라면, 이 숫자는 0의 연속된 묶음이다.
그렇지만, s[i]가 1이라면 이 숫자는 1의 연속된 묶음이다. 나누어준 뒤, 둘 중 작은 값을 출력하면된다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
int main()
{
fastio;
string s;
cin >> s;
// zero_cnt,one_cnt
int zero_series = 0;
int one_series = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] != s[i + 1] && s[i] == '0')
{
zero_series++;
continue;
}
if (s[i] != s[i + 1] && s[i] == '1')
one_series++;
}
cout << min(zero_series, one_series) << '\n';
return 0;
}