예를 들어 스위치 A, B, C가 있고 세 스위치는 모두 켜져있다고 하자.
A B C
0 0 0
이와 같은 상태일 때
스위치 B를 누르면
A B C
0 0 X
스위치 C를 누르면
A B C
0 X 0
이와 같은 변화로 알 수 있는 것은
스위치를 누르고 난 후에 그 상태가 고정되는 것은 눌러진 스위치가 아니라
눌러진 스위치 바로 전의 스위치라는 것이다.
스위치 B의 상태는 B를 눌렀을 때 0 이었지만, C를 누르고 난 후에 X로 최종적으로 결정 된다.
따라서 i번째 스위치는
current[i-1] != future[i-1] 인 경우에 누르면 되는 것이다.
for i in 1..<N {
if current[i-1] != future[i-1] {
// 스위치 누름
count += 1
}
}
그러나 이렇게 하면 i가 0일 때인 가장 처음 스위치를 누르는 경우는 고려하지 못하게 된다.
0번째 스위치는 눌러질 수도 눌러지지 않을 수도 있기 때문에 누르는 경우, 누르지 않는 경우를 나누어서 두 번 연산해주면 된다.
import Foundation
let N = Int(readLine()!)!
var current = Array(readLine()!).map{Int(String($0))!}
var future = Array(readLine()!).map{Int(String($0))!}
var result = Int.max
func isSame(_ current: [Int]) -> Bool {
var temp = current
var count = 0
for i in 1..<N {
if temp[i-1] != future[i-1] {
var changeRange = [i-1,i,i+1]
if i == (N-1) {
changeRange = [i-1, i]
}
for j in changeRange {
temp[j] = temp[j] == 0 ? 1 : 0
}
count += 1
}
}
let isSame = temp == future
result = isSame ? min(result, count) : result
return isSame
}
if isSame(current) {
print(result)
} else {
current[0] = current[0] == 0 ? 1 : 0
current[1] = current[1] == 0 ? 1 : 0
if isSame(current) {
print(result+1)
} else {
print(-1)
}
}