[BOJ: 1244] - Python / 파이썬 - 스위치 켜고 끄기

o_jooon_·2024년 3월 13일
0

BOJ

목록 보기
42/44
post-thumbnail

서론

구현 문제입니다.
정답 출력을 20개씩 나란히 하는 것에 주의하시면 됩니다.

난이도

실버 4


문제

조건

시간 제한메모리 제한
2 초128 MB

1부터 연속적으로 번호가 붙어있는 스위치들이 있다. 스위치는 켜져 있거나 꺼져있는 상태이다. <그림 1>에 스위치 8개의 상태가 표시되어 있다. ‘1’은 스위치가 켜져 있음을, ‘0’은 꺼져 있음을 나타낸다. 그리고 학생 몇 명을 뽑아서, 학생들에게 1 이상이고 스위치 개수 이하인 자연수를 하나씩 나누어주었다. 학생들은 자신의 성별과 받은 수에 따라 아래와 같은 방식으로 스위치를 조작하게 된다.

남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다. 즉, 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다. <그림 1>과 같은 상태에서 남학생이 3을 받았다면, 이 학생은 <그림 2>와 같이 3번, 6번 스위치의 상태를 바꾼다.

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다.

스위치 번호
스위치 상태01010001

<그림 1>

예를 들어 <그림 2>에서 여학생이 3을 받았다면, 3번 스위치를 중심으로 2번, 4번 스위치의 상태가 같고 1번, 5번 스위치의 상태가 같으므로, <그림 3>과 같이 1번부터 5번까지 스위치의 상태를 모두 바꾼다. 만약 <그림 2>에서 여학생이 4를 받았다면, 3번, 5번 스위치의 상태가 서로 다르므로 4번 스위치의 상태만 바꾼다.

스위치 번호
스위치 상태01110101

<그림 2>

스위치 번호
스위치 상태10001101

<그림 3>

입력으로 스위치들의 처음 상태가 주어지고, 각 학생의 성별과 받은 수가 주어진다. 학생들은 입력되는 순서대로 자기의 성별과 받은 수에 따라 스위치의 상태를 바꾸었을 때, 스위치들의 마지막 상태를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 있다. 셋째 줄에는 학생수가 주어진다. 학생수는 100 이하인 양의 정수이다. 넷째 줄부터 마지막 줄까지 한 줄에 한 학생의 성별, 학생이 받은 수가 주어진다. 남학생은 1로, 여학생은 2로 표시하고, 학생이 받은 수는 스위치 개수 이하인 양의 정수이다. 학생의 성별과 받은 수 사이에 빈칸이 하나씩 있다.


출력

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다. 예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다. 켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.


예시

예제 입력 1

8
0 1 0 1 0 0 0 1
2
1 3
2 3

예제 출력 1

1 0 0 0 1 1 0 1

풀이

0부터 시작하는 인덱스 때문에 식이 조금 복잡해 보이지만,
switch 입력을 [-1] + list(map(int, input().split()) 과 같은 식으로 받는다면 편하게 풀 수도 있습니다.

풀이 자체는 간단합니다.
남자인 경우엔 입력 받은 숫자(num)의 배수에 해당하는 스위치를 바꿔주고,
여자인 경우엔 입력 받은 숫자(num)을 일단 바꾼 후, 좌 우의 인덱스를 늘려가며 동일한 경우에만 바꿔줍니다.

정답 출력은 20번째 스위치 출력마다 줄바꿈을 해주어야 하기 때문에 그냥 출력하면 출력 오류납니다.

코드

import sys
input = sys.stdin.readline

n = int(input())
switch = list(map(int, input().split()))
student = [list(map(int, input().split())) for _ in range(int(input()))]

for gen, num in student:						# 입력 받은 학생의 성별과 숫자 탐색
    if gen == 1:								# 남자인 경우
        for i in range(num - 1, n, num):		# num의 배수를 탐색하며
            switch[i] = 1 - switch[i]			# 스위치를 바꿈
    else:										# 여자인 경우
        left, right = num - 2, num				# 왼쪽 오른쪽을 비교해줄 변수 선언
        switch[num - 1] = 1 - switch[num - 1]	# num번째 스위치 바꿈
												# 양 쪽이 같을 경우에만 반복
        while left >= 0 and right < n and switch[left] == switch[right]:
            switch[left] = 1 - switch[left]		# 왼쪽 스위치 바꿈
            switch[right] = 1 - switch[right]	# 오른쪽 스위치 바꿈
            left -= 1							# 왼쪽 인덱스 감소
            right += 1							# 오른쪽 인덱스 증가

for i in range(n):
    print(switch[i], end=' ')
    if i in [19, 39, 59, 79]:					# 20번 출력마다 줄바꿈
        print()

실행 결과

profile
iOS개발 공부 중입니다.

0개의 댓글