[Swift] 백준 2138 - 전구와 스위치

1940 단어 greedygreedy

문제 바로가기

풀이

예를 들어 스위치 A, B, C가 있고 세 스위치는 모두 켜져있다고 하자.

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번째 스위치는 눌러질 수도 눌러지지 않을 수도 있기 때문에 누르는 경우, 누르지 않는 경우를 나누어서 두 번 연산해주면 된다.

제출한 코드


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

좋은 웹페이지 즐겨찾기