N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는(1) 상태와 꺼져 있는 (0) 상태 중 하나의 상태를 가진다. i(1<i<N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져 있는 전구는 켜지고, 켜져 있는 전구는 꺼지게 된다. 1번 스위치를 눌렀을 경우에는 1, 2번 전구의 상태가 바뀌고, N번 스위치를 눌렀을 경우에는 N-1, N번 전구의 상태가 바뀐다.
N개의 전구들의 현재 상태와 우리가 만들고자 하는 상태가 주어졌을 때, 그 상태를 만들기 위해 스위치를 최소 몇 번 누르면 되는지 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(2≤N≤100,000)이 주어진다. 다음 줄에는 전구들의 현재 상태를 나타내는 숫자 N개가 공백 없이 주어진다. 그 다음 줄에는 우리가 만들고자 하는 전구들의 상태를 나타내는 숫자 N개가 공백 없이 주어진다.
voidchange(vector<int>& a, int now)// i-1, i, i+1을 뒤집는 함수 { for (int i = now - 1; i <= now + 1; i++) { if (i >= 0 && i < a.size()) // 범위 내에서 a[i] = 1 - a[i]; // 0 -> 1, 1 -> 0 } }
pair<bool, int> go(vector<int> a, vector<int>& b) // a와 b가 같은지, 같다면 몇 번만에 가능한지 리턴(a를 변경하지 않음) { int ans = 0;
for (int i = 0; i < a.size() - 1; i++) { if (a[i] != b[i]) // 현재 인덱스가 다르면 { change(a, i + 1); // i+1의 스위치를 누른다.(0번은 누르지 않음) ans++; // 누르는 횟수 count } }
if (a == b) // 연산 후 두 벡터가 같다면 { return { true, ans }; } else { return { false, ans }; }