2138 전구와 스위치

정민용·2023년 4월 23일

백준

목록 보기
146/286

문제

N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져 있는 전구는 켜지고, 켜져 있는 전구는 꺼지게 된다. 1번 스위치를 눌렀을 경우에는 1, 2번 전구의 상태가 바뀌고, N번 스위치를 눌렀을 경우에는 N-1, N번 전구의 상태가 바뀐다.

N개의 전구들의 현재 상태와 우리가 만들고자 하는 상태가 주어졌을 때, 그 상태를 만들기 위해 스위치를 최소 몇 번 누르면 되는지 알아내는 프로그램을 작성하시오.

# 2138
import sys
input = lambda: sys.stdin.readline().strip()

n = int(input())
my_list = list(input())
my_list_c = my_list[::]
out_list = list(input())

def change(array, i):
    if array[i] == "0":
        array[i] = "1"
    else:
        array[i] = "0"
        
di = [-1, 0, 1]

count_1 = 0
for i in range(1, n):
    if my_list[i-1] != out_list[i-1]:
        for d in di:
            ni = i + d
            if ni < 0 or ni >= n:
                continue
            change(my_list, ni)
        count_1 += 1
        
count_2 = 1
change(my_list_c, 0)
change(my_list_c, 1)
for i in range(1, n):
    if my_list_c[i-1] != out_list[i-1]:
        for d in di:
            ni = i + d
            if ni < 0 or ni >= n:
                continue
            change(my_list_c, ni)
        count_2 += 1

iscount_1True = my_list == out_list
iscount_2True = my_list_c == out_list

if iscount_1True and iscount_2True:
    print(min(count_1, count_2))
elif iscount_1True:
    print(count_1)
elif iscount_2True:
    print(count_2)
else:
    print("-1")
    
# my_list[i-1] == out_list[i-1] -> 스위치 동작 X
# my_list[i-1] != out_list[i-1] -> 스위치 동작 O

백준 2138 전구와 스위치

0개의 댓글