프로그래밍/Python

백준_python 1244번 스위치 켜고 끄기 (구현)

O'bin 2024. 8. 2. 23:47

<문제 링크>

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

 

 

<정답 코드>

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
import sys
input = sys.stdin.readline
 
= int(input())        # 스위치 수
switch = [-1+ list(map(int, input().split()))
= int(input())        # 학생 수
 
for _ in range(M):
    student, num = map(int, input().split())
    if student == 1:    # 남학생일 경우
        for i in range(num, N+1, num):
            switch[i] = 1 - switch[i]
    elif student == 2:  # 여학생일 경우
        switch[num] = 1 - switch[num]
        left, right = num - 1, num + 1
        while left > 0 and right <= N and switch[left] == switch[right]:
            switch[left] = 1 - switch[left]
            switch[right] = 1 - switch[right]
            left -= 1
            right += 1
 
for i in range(1, N+1):
    print(switch[i], end=" ")
    if i % 20 == 0:
        print()
cs

 

남학생일 경우 주어진 수(num)의 배수

-> (line 11)  range에서 i를 num부터 num씩 증가시키기

에 위치하는 스위치 0이면 1로, 1이면 0으로 변경

-> (line 12) 1에서 현재 switch[i] 뺀 값으로 업데이트

 

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로, 

좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서

-> (line 16) left와 right가 인덱스를 벗어나지 않으면서 switch[left]와 switch[right]가 일치

그 구간에 속한 스위치의 상태 모두 바꿈

-> (line 17,18) 1에서 현재 switch[i] 뺀 값으로 업데이트

 

어려운 구현은 아니었지만, 위와 같은 아이디어로 간단하게 구현할 수 있다.