
정렬에 해당하는 백준 : 1244 스위치 켜고 끄기 문제
우선 남자와 여자 케이스를 나눠서 문제를 풀었다.
남자의 경우 스위치 번호 내에서 각 학생이 가진 스위치 번호의 배수만 찾아내면 되었다.
여자의 경우 학생이 가진 번호를 기준으로 양쪽으로 스위치 상태의 여부를 판단해야 해서 스위치 번호 범위를 벗어나거나 대칭이 깨질 때까지 찾아내서 문제를 풀었다.
import sys
n = int(input()) # number of switches
switch = list(map(int, sys.stdin.readline().split())) # state of switch -> on:1 / off:0
std = int(input()) # number of student
for _ in range(std):
sex, number = map(int,sys.stdin.readline().split())
if sex == 1: # man
for i in range(1,n+1):
if i % number == 0:
if switch[i-1] == 1:
switch[i-1] = 0
else:
switch[i-1] = 1
else: #female
number -=1
left, right = number, number
while (left >= 0 and right < n and switch[left]==switch[right]):
left-=1
right+=1
left+=1
right-=1
for i in range(left,right+1):
if switch[i] == 1:
switch[i] = 0
else:
switch[i] = 1
for i in range(n):
print(switch[i],end=' ')
if((i+1)%20==0):
print()
코드를 위와 같은 방법으로 작성했는데 개선할 부분이 많아 보여 다른 사람들의 코드를 참고하여 어떤 부분을 고쳐야할지 찾아보았다.
1. 반복된 부분 함수로 작성
: 남자와 여자 모두 스위치를 변환하는 부분이 공통적으로 있다.
2. 남자 - for문 개선
: if 문을 통해 배수 여부를 판단해도 되지만 for문을 일일이 다 돌지 않고 range를 이용해 간격을 두어 배수만 찾도록 한다.
for i in range(number, n+1, number):