[Swift]白駿2138-電球とスイッチ



問題のショートカット

に答える


例えば、スイッチA、B、C、3つのスイッチが入っています.
A B C
0 0 0
この場合.
  • スイッチAを押す
    A B C
    X X 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番目のスイッチは押されても押されなくてもよいので、押すと2回押さないように分けて演算することができます.

    コミットされたコード

    
    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)
        }
    }