64 lines
1.8 KiB
Python
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 클래스를 만들어서 상속 받아서 하면 좀 더 안전한 코드가 될 것 같다.
|
|
|
|
""" |