고립된 1과 0의 고립 개수를 모두 세는 것으로 문제 풀이 방식을 정했습니다.
000100 -> 1은 0에 의해 고립됨 1개 / 0은 왼쪽 벽과 오른쪽 1, 왼쪽 1과 오른쪽 벽에 고립됨. 2개
flagZero > 0이 반복될 때 셈 증가를 막음. 만약 1의 문자가 선택되었다면 다음 0을 만났을 때 셈을 증가시키기 위해 flagZero = true로 설정
flagOne > 1이 반복될 때 셈 증가를 막음. 만약 0의 문자가 선택되었다면 다음 1을 만났을 때 셈을 증가시키기 위해 flagOne = true로 설정
000???00 >
처음 0일 때, 0의 셈을 한 번 증가시키고 flagZero = false로 재할당하여 더 이상 증가하지 못하게 막습니다. (만약 0만 반복된다면, 어쨋든 왼쪽/오른쪽 벽에 의해 막힌, 고립 상태로 가정)
이후 계속 0을 만난다면, flagZero = false로 설정하여 셈 증가를 막습니다.
다음으로 만나는 1에서 flagZero = true로 설정하여 다음 0을 대비하고, flagOne = false로 설정하여 1이 반복될 때 셈 증가를 막습니다. 마찬가지로 0을 만날 때는 flagOne = true로 합니다.
이런 식으로 0과 1의 고립된 집합 개수 중, 적은 것을 선택하여 최소한의 뒤집기 횟수를 출력합니다.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
char[] input = bfr.readLine().toCharArray();
int zero = 0;
int one = 0;
boolean flagOne = true;
boolean flagZero = true;
for (char c : input) {
if (c == '1') {// 고립된 1을 셈
flagZero = true;
if (flagOne) {
flagOne = false;
one++;
}
} else {//고립된 0을 셈
flagOne = true;
if (flagZero) {
flagZero = false;
zero++;
}
}
}
if(one > zero)
System.out.println(zero);
else
System.out.println(one);
bfr.close();
}
}