- toc {:toc}
풀이
- 아이디어 1 변경될 때마다 flip을 1씩 증가시켜 풀이하자! num[0] 을 타겟값으로 받고 타겟값과 같지 않다면 flip을 증가시키고 타겟값을 비교한 값으로 교환한다.
문제 : 0001100 일 때 0 → 1, 1 → 0으로 갈 때 2번을 모두 세기 때문에 풀이할 수 없다.
- 아이디어 2 그렇다면 0001100 에서 0 → 1일 때는 세지 말고 1 → 0으로 가는 뒷 부분만 flip을 증가시키자!
문제 : 100000 일 때는 flip이 증가하지 않는다.
- 아이디어 3 0과 1 중 개수가 적은 수를 선택해서 해당 뭉치가 탐지된 경우 flip을 증가시킨다.
문제 : 뭉치의 수가 중요한 것이지 0과 1의 개수가 flip 횟수에 영향을 미치지 않는다.
- 아이디어 4 0 뭉치, 1 뭉치를 각각 센다. num[0] 으로 초기값을 설정하고 해당 뭉치에서 다른 뭉치로 넘어갔을 때 해당 뭉치를 카운트한다. 뭉치의 개수를 전부 카운트한 후 둘 중 뭉치수가 작은 수를 반환하면 그 값이 최소 flip 수가 된다.
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int flip = 0, one=0, zero=0;
string num;
cin >> num;
char target;
if(num.size() == one || num.size() == zero){
cout << 0 << '\n';
exit(0);
}
if(num[0] == '0') zero++;
else one++;
target = num[0];
for(int i = 1; i < num.size(); i++){
if(target != num[i]) {
if(num[i] == '0') zero++;
else one++;
target = num[i];
}
}
if(zero > one) flip = one;
else flip = zero;
cout << flip << '\n';
return 0;
}