백준 1439번, 뒤집기

95qwer·2022년 5월 11일
0


고립된 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();
	}
 }
profile
한땀한땀오타없이

0개의 댓글