Files
baekjoon-study/workbook_8708/silver/1244-s4.py
2026-02-23 11:14:50 +09:00

64 lines
1.8 KiB
Python

# 스위치 켜고 끄기
import sys
input = sys.stdin.readline
def work_mode1(s, s_state, s_num):
mul = 1
idx = s_num * mul
while idx <= s:
s_state[idx] = 1 - s_state[idx]
mul += 1
idx = s_num * mul
return
def work_mode2(s, s_state, s_num):
gap = 1
s_state[s_num] = 1 - s_state[s_num]
while s_num + gap <= s and s_num - gap >= 1:
if s_state[s_num + gap] != s_state[s_num - gap]:
break
s_state[s_num + gap] = 1 - s_state[s_num + gap]
s_state[s_num - gap] = 1 - s_state[s_num - gap]
gap += 1
return
WORK = {
1: work_mode1,
2: work_mode2
}
def solution():
s = int(input().rstrip())
s_state = [-1] + list(map(int, input().rstrip().split()))
n = int(input().rstrip())
for _ in range(n):
mode, s_num = map(int, input().rstrip().split())
now_work = WORK[mode]
now_work(s, s_state, s_num)
s_state = s_state[1:]
for i in range(s//20+1):
start, end = i*20, (i*20)+20
print(*s_state[start:end])
return
solution()
"""
걸린 시간: 16분
시간 복잡도: 남자, 여자 둘 다 한 턴에 스위치 전체 길이인 s에 대해 O(s)이므로 전체 시간 복잡도는 학생 수가 n일 때, O(s*n) 이다.
해설: 남자(mode1), 여자(mode2)로 작업을 나눠서 배수는 1,2,3 올라가면서 시작 버튼에 곱해주고, 옆으로 확인은 gap을 +1 해주면서
확인한다. while 반복문의 기본 규칙은 1과 s 사이의 범위이고, mode2에서 추가 escape는 보고 있는 두 스위치의 상태가 다를 때이다.
메인 함수에서는 mode에 맞게 work 함수를 할당 받은 후 작업을 진행하고, 20단위로 끊어서 출력한다.
추가로 worker 클래스를 만들어서 상속 받아서 하면 좀 더 안전한 코드가 될 것 같다.
"""