[백준 1244][python] 스위치 켜고 끄기

alllloha·2021년 8월 6일
0

문제

1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.

남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. <그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.

스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 0 1 0 0 0 1
<그림 1>

예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.

스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 0 1 1 1 0 1 0 1
<그림 2>

스위치 번호 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧
스위치 상태 1 0 0 0 1 1 0 1
<그림 3>

입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오
(링크 - https://www.acmicpc.net/problem/1244)

출력 check

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.

해결

단순 시뮬레이션이라 주어진 조건에 따라 해결했다.
여자 부분이 까다로울 수 있는데, left, right 변수를 지정해서 status의 두 위치가 같으면 스위치 상태를 바꾸고 다르면 바로 break해서 탐색을 중지하도록 코드를 작성했다.

코드

switch  = int(input())
status = list(map(int, input().split()))

student = int(input())
student_status = [(map(int, input().split())) for _ in range(student)]

def change(loc):
    if status[loc] == 0:
        status[loc] = 1
    else:
        status[loc] = 0

for s, num in student_status:
    if s == 1: #남자라면
        for i in range(switch):
            if (i+1)%num == 0:
                #print(i)
                change(i)

    if s == 2: #여자라면
        num -= 1
        change(num)

        left = num - 1
        right = num + 1
        while 0 <= left and right < switch:
            if status[left] == status[right]:
                change(left)
                change(right)
                left -= 1
                right += 1
            else:
                break

temp = 0
for stat in status:
    print(stat, end = ' ')
    temp += 1
    if temp == 20:
        print("")
        temp = 0
print("")

로직은 다 맞았는데 출력 방식을 실수해서 몇번 틀렸다.
문제를 꼼꼼히 보는 습관을 기르자!

0개의 댓글