i번 스위치를 누르면 i-1, i, i+1번째 전구의 상태가 flip된다.
0번째 스위치는 눌리거나 눌리지 않는다. 0번 스위치를 누를 때와 그렇지 않을 때로 케이스를 나눈 다음, 각각의 케이스마다 인덱스의 값과 원하는 상태의 값이 같으면 skip, 아니면 스위치를 눌러주는 과정을 배열의 끝까지 계속한다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#define MAX 100001
using namespace std;
int N, ans = MAX;
string first, second, tmp;
void push(int idx) {
if (idx > 0) tmp[idx - 1] = (tmp[idx - 1] == '0') ? '1' : '0';
tmp[idx] = (tmp[idx] == '0') ? '1' : '0';
if(idx < N - 1) tmp[idx + 1] = (tmp[idx + 1] == '0') ? '1' : '0';
}
void solve(bool turn) {
int i, cnt = 0;
tmp = first;
if (turn) {
tmp[0] = (tmp[0] == '0') ? '1' : '0';
tmp[1] = (tmp[1] == '0') ? '1' : '0';
cnt++;
}
for (i = 1; i < N; i++) {
if (tmp[i - 1] != second[i - 1]) {
push(i);
cnt++;
}
}
if (tmp == second) ans = min(ans, cnt);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N;
cin >> first;
cin >> second;
solve(true); // 1번 스위치를 누르는 경우
solve(false); // 1번 스위치를 누르지 않는 경우
if (ans == MAX) cout << -1 << endl;
else cout << ans << endl;
system("pause");
return 0;
}