이 문제는 접근방법이 도저히 떠오르지 않아서 아래 블로그를 참고했다.
https://sa11k.tistory.com/50
블로그를 보니 이 문제의 중요한 포인트는 i번째 전구의 최종상태는 i + 1번째 스위치가 결정한다는 것이다. 코드를 보면 알겠지만 이러한 이유로 인해 i - 1번째 전구의 상태를 비교하면서 i번째 스위치를 누를지 말지 결정한다.
또 블로그를 보면서 한가지 궁금했던 것이 왜 첫번째(0번 인덱스) 스위치를 누른 것과 누르지 않은 것을 별도로 확인하는 것이었다. 이유를 생각해보니 첫번째 스위치를 누르는 지 여부는 어떠한 전구의 최종상태도 결정지을 수 없기 때문에, 첫번째 스위치를 누르고 진행하는 것과, 누르지 않고 진행하는 것은 각각 독립적인 결과를 가져오기때문에 각각의 경우를 나누어 진행한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
// N개의 스위치, N개의 전구
// 전국는 켜져 있거나 꺼져 있거나이다
// i번 스위치를 누르면 i -1, i, i + 1 전구 상태가 바뀜
// 현재 상태에서 만들고자 하는 상태로 스위치를 최소 몇번 눌러야 변경가능한가?
// 0은 켜져있고, 1은 꺼져있다.
static boolean[] origin, to, originSwitchFirst;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String original = br.readLine();
String change = br.readLine();
origin = new boolean[n];
to = new boolean[n];
for (int i = 0; i < n; i++) {
if (original.charAt(i) == '0') {
origin[i] = true;
}
if (change.charAt(i) == '0') {
to[i] = true;
}
}
int count = 0;
originSwitchFirst = Arrays.copyOf(origin, n);
int countSwitchFirst = 0;
for (int i = 0; i < n; i++) {
if (i == 0) {
switching(i, originSwitchFirst);
countSwitchFirst++;
} else {
if (origin[i - 1] != to[i - 1]) {
switching(i, origin);
count++;
}
if (originSwitchFirst[i - 1] != to[i - 1]) {
switching(i, originSwitchFirst);
countSwitchFirst++;
}
}
if (Arrays.equals(origin, to) && Arrays.equals(originSwitchFirst, to)) {
System.out.println(Math.min(count, countSwitchFirst));
return;
}
if (Arrays.equals(origin, to)) {
System.out.println(count);
return;
}
if (Arrays.equals(originSwitchFirst, to)) {
System.out.println(countSwitchFirst);
return;
}
}
System.out.println(-1);
}
private static void switching (int idx, boolean[] array) {
for (int i = idx - 1; i <= idx + 1; i++) {
if (i < 0 || i >= array.length) {
continue;
}
array[i] = !array[i];
}
}
}