KEEP GOING

[python] 백준 2138번 : 전구와 스위치 본문

code review/greedy

[python] 백준 2138번 : 전구와 스위치

jmHan 2022. 1. 21. 15:56
반응형

https://www.acmicpc.net/problem/2138

 

2138번: 전구와 스위치

N개의 스위치와 N개의 전구가 있다. 각각의 전구는 켜져 있는 상태와 꺼져 있는 상태 중 하나의 상태를 가진다. i(1 < i < N)번 스위치를 누르면 i-1, i, i+1의 세 개의 전구의 상태가 바뀐다. 즉, 꺼져

www.acmicpc.net

 

n = int(input())
bulb = list(map(int, input()))
target = list(map(int, input()))


def change(A, B):
    L = A[:]
    press = 0
    for i in range(1, n):
        # 이전 전구가 같은 상태면 pass
        if L[i-1] == B[i-1]:
            continue
        # 상태가 다를 경우
        press += 1
        for j in range(i-1, i+2):
            if j<n:
                L[j] = 1 - L[j]
    return press if L == B else 1e9


# 첫번째 전구의 스위치를 누르지 않는 경우
res = change(bulb, target)
# 첫번째 전구의 스위치를 누르는 경우
bulb[0] = 1 - bulb[0]
bulb[1] = 1 - bulb[1]
res = min(res, change(bulb, target) + 1)
print(res if res != 1e9 else -1)

 

[Hint]

1. 첫번째 스위치를 누르는 경우와 누르지 않는 경우로 분리한다. 

2. 첫번째(index = 0)를 제외한 1번째부터 마지막 번호를 i라고 했을때, i-1 번째에 있는 스위치가 target 스위치의 값과 같은지 비교한다.

3. 만약 값이 다르다면 i-1, i, i+1 번째 위치의 값을 반전시켜준다.  이때 마지막 위치에 스위치는 i+1 번째가 없기 때문에 구현할 때 주의한다.

 

 

반응형
Comments