티스토리 뷰

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

 

2138번: 전구와 스위치

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

www.acmicpc.net

문제

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

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

코드

import sys
n = int(sys.stdin.readline())
before = list(map(int, sys.stdin.readline().rstrip()))
after = list(map(int, sys.stdin.readline().rstrip()))
def switch(s, cnt):
    if cnt == 1:
        s[0] = 1 - s[0]
        s[1] = 1 - s[1]
    for i in range(1, n):
        if s[i - 1] != after[i - 1]:
            cnt += 1
            s[i - 1] = 1 - s[i - 1]
            s[i] = 1 - s[i]
            if i != n - 1:
                s[i + 1] = 1 - s[i + 1]
    if s == after:
        return cnt
    return -1
result1 = switch(before[:], 0)
result2 = switch(before[:], 1)
if result1 >= 0 and result2 >= 0:
    sys.stdout.write(str(min(result1, result2)))
elif result1 >= 0 and result2 < 0:
    sys.stdout.write(str(result1))
elif result1 < 0 and result2 >= 0:
    sys.stdout.write(str(result2))
else:
    sys.stdout.write("-1")

풀이

 첫번째 스위치를 눌렀을 경우와 안눌렀을 경우 두번을 계산해 두 경우 중 양의 정수가 있으면 더 작은 수를 출력하고 없으면 -1 을 출력한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함