https://www.acmicpc.net/problem/1439
입력으로 주어지는 문자열은 0과 1로 이루어져있고, 최소한의 행동으로 전부 같게 만들어야 한다. 한번 뒤집는 행동은 연속으로 이루어져있는 수를 한번에 뒤집을 수 있다.
그렇기 때문에 연속된 수를 묶어서 처리하기 위해 문자열을 순차적으로 탐색하면서, 연속이 끊긴 부분에 대해서 카운트를 해준다는 생각으로 문제에 접근하였고, map container를 이용하여 0과, 1의 연속된 수 집합의 개수를 저장하여 그 최솟값을 출력하도록 하였다.
#include<iostream>
#include<map>
using namespace std;
int main() {
string str;
map<char, int> consecutiveCnt; //연속된 수를 저장
int answer; // 최소 횟수
cin >> str;
char temp = str[0]; // 이전값을 비교하기 위한 임시변수
consecutiveCnt[temp]++;
//수가 바뀌면 해당값을 저장
for (int i = 1; i < str.size(); i++) {
if (temp != str[i]) {
consecutiveCnt[str[i]]++;
temp = str[i];
}
}
//한번도 뒤집어진 적이 없는 경우
if (consecutiveCnt.size() == 1) {
cout << 0;
}
//최솟값
else {
answer = min(consecutiveCnt['0'], consecutiveCnt['1']);
cout << answer;
}
return 0;
}