[백준] 1244 : 스위치 켜고 끄기 / 파이썬 / 정렬

ChaeYuuu·2024년 7월 14일

Algorithm

목록 보기
7/7

💻 문제

정렬에 해당하는 백준 : 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):
profile
아무것도 머르게떠염

0개의 댓글