QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

2138. 전구와 스위치

업데이트 시간 : 2023-03-21 01:06:06 +0000

[Gold V] 전구와 스위치 - 2138

문제 링크

성능 요약

메모리: 33604 KB, 시간: 160 ms

분류

그리디 알고리즘

문제 설명

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

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

입력

첫째 줄에 자연수 N(2 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 전구들의 현재 상태를 나타내는 숫자 N개가 공백 없이 주어진다. 그 다음 줄에는 우리가 만들고자 하는 전구들의 상태를 나타내는 숫자 N개가 공백 없이 주어진다. 0은 켜져 있는 상태, 1은 꺼져 있는 상태를 의미한다.

출력

첫째 줄에 답을 출력한다. 불가능한 경우에는 -1을 출력한다.

💡 Solutions

📄 전구와 스위치.py

N = int(input())
start = list(map(int, input()))
end =  list(map(int, input()))
start_cpy = start[:]
rlt = 2*N
d= (-1,0,1)

x = 0
is_click = False
# cpy는 첫번째 스위치 켜고 출발
for k in d:
    nx = x + k
    if nx < 0 or nx >= N: continue
    start_cpy[nx] = (start_cpy[nx] + 1) % 2
ans = 0
ans_cpy = 1
x += 1


while x < N:

    x_ = x - 1
    if (start[x_] != end[x_]) :
        ans += 1
        for k in d:
            nx = x + k
            if nx < 0 or nx >= N: continue
            start[nx] = (start[nx] + 1) % 2
        pass
    if (start_cpy[x_] != end[x_]) : 
        ans_cpy += 1
        for k in d:
            nx = x + k
            if nx < 0 or nx >= N: continue
            start_cpy[nx] = (start_cpy[nx] + 1) % 2
        pass
        # is_start = False
        # if (start[nx] != end[nx]):
        #     is_click = True
    x += 1

if start == end:
    rlt = min(ans,rlt)
if start_cpy == end:
    rlt = min(ans_cpy,rlt)
if rlt == 2*N:
    rlt = -1
print(rlt)