[PS] BOJ 1244 / 스위치 켜고 끄기
문제 링크: https://www.acmicpc.net/problem/1244
Thumbnail: Photo by Vincent Battault (Unsplash)
아이디어는 굉장히 간단히 떠올랐는데, 이상한데서 삽질하느라 몇차례 틀렸습니다...
풀이
먼저, 스위치는 \(0\)과 \(1\) 두 가지를 가질 수 있습니다. 그냥 코드에 바로 써도 되지만, 가독성을 위해 스위치의 상태를 변경하는 함수를 별도로 분리했습니다.
def turn_switch(x):
SW_LIST[x] = 1 - SW_LIST[x] # 0이면 1 - 0 = 1, 1이면 1 - 1 = 0남학생 / 여학생 각각이 스위치를 켜고 끄는 방식이 다릅니다. 이를 각각 함수로 먼저 생각해봅시다.
남학생
\(x\)라는 수를 받으면, 스위치의 번호 중 \(x\)의 배수에 해당하는 모든 스위치의 상태를 바꾸면 됩니다.
def boy(x: int):
for i in range(x, SW_CNT+1, x):
turn_switch(i)여학생
\(x\)라는 수를 받으면, \(x\)를 중심으로 하는 구간에서, 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서 구간 내의 모든 스위치의 상태를 바꾸면 됩니다.
먼저, \(x\)에 해당하는 스위치는 무조건 구간에 포함됩니다.
이후, 좌우로 1칸씩 범위를 넓혀가며 스위치의 상태가 동일한지 비교합니다. 동일하다면, 구간에 포함되므로 두 스위치의 상태를 변경해주고 다음 칸으로 이동합니다.
단, 구간의 왼쪽 끝은 1보다 같거나 커야 하며, 오른쪽 끝은 스위치의 개수 \(N\)보다 작거나 같아야 합니다.
이 과정을 코드로 보면 아래와 같습니다.
def girl(x: int):
turn_switch(x) # 중앙 먼저 스위치 바꾸기
gap = 1
while x - gap >= 1 and x + gap <= SW_CNT and SW_LIST[x-gap] == SW_LIST[x+gap]:
turn_switch(x - gap)
turn_switch(x + gap)
gap += 1전체 코드
from sys import stdin
SW_CNT = int(stdin.readline()) # 스위치 개수
SW_LIST = [-1, ] # 초기 스위치 정보 (인덱스 1부터 시작하게 하려고 0번에 False 넣어둠.)
SW_LIST.extend(map(int, stdin.readline().split())) # 1번부터 N번까지 스위치 정보 받음.
STU_CNT = int(stdin.readline()) # 학생 수
def turn_switch(x):
"""
x번 스위치의 상태를 바꾼다.
Args:
x (int): 바꾸려는 스위치의 번호. (1~N으로 인덱스 사용.)
"""
SW_LIST[x] = 1 - SW_LIST[x]
def boy(x: int):
"""
남학생의 스위치 조작 방식을 구현한다.
Args:
x (int): 남학생이 받은 숫자.
"""
for i in range(x, SW_CNT+1, x):
turn_switch(i)
def girl(x: int):
"""
여학생의 스위치 조작 방식을 구현한다.
Args:
x (int): 여학생이 받은 숫자.
"""
turn_switch(x) # 중앙 먼저 스위치 바꾸기
# 좌/우 경계 설정
gap = 1
while x - gap >= 1 and x + gap <= SW_CNT and SW_LIST[x-gap] == SW_LIST[x+gap]:
turn_switch(x - gap)
turn_switch(x + gap)
gap += 1
for _ in range(STU_CNT):
gender, x = map(int, stdin.readline().split())
if gender == 1:
boy(x)
else:
girl(x)
i = 1
while i <= SW_CNT:
print(" ".join(map(str, SW_LIST[i: i+20])))
i += 20
solution.py
시행착오
출력 조건을 제대로 읽지 않아 1번 틀렸었고, 고민 끝에 슬라이싱으로 간단하게 개행을 구현했습니다.
이후 4%에서 계속 틀려서 여학생 부분을 검토했었는데, 막상 남학생 부분에서 반복문의 범위 설정에 문제가 있었다는 것을 뒤늦게 깨달았습니다... 바로 수정하고 맞혔답니다 :D