[백준 1244] 스위치 켜고 끄기

🥚문제

https://www.acmicpc.net/problem/1244

  • 구현
  • 시뮬레이션


🥚입력/출력


🍳코드

import sys
input = sys.stdin.readline

def boy(num):
    idx = num
    while idx <= n:
        swch[idx] = 0 if swch[idx] == 1 else 1
        idx += num

def girl(num):
    i = 0
    while 1 <= num - i and num + i <= n:
        if swch[num-i] != swch[num+i]:
            break

        x = swch[num-i]
        swch[num-i] = swch[num+i] = 0 if x == 1 else 1

        i += 1

n = int(input())
swch = [-1] + list(map(int, input().split()))
for _ in range(int(input())):
    sex, num = map(int, input().split())
    if sex == 1:
        boy(num)
    else:
        girl(num)

# 스위치의 상태를 한 줄에 20개씩 출력한다.
for i in range(1, n+1):
    if i % 20 == 0:
        print(swch[i])
    else:
        print(swch[i], end = ' ')

🧂아이디어

구현

  • 남학생: 입력으로 받은 번호가 num이면, num의 배수 위치에 있는 스위치의 상태 반전
    • boy(num)함수: idx(초기값 num)가 범위 내에 있을 때까지 idx에 num을 더해가며 스위치 상태를 반전해준다.
  • 여학생: 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수.
    • girl(num)함수: i를 0부터 시작해 1씩 늘려가면서 num-i과 num+i가 범위 내에 있는지 확인한다.
      범위 내에 있고, swch[num-i]와 swch[num+i]의 값이 같으면 그 값들을 반전해준다.
      범위 내에 있지 않거나 두 값이 같지 않다면 break.
  • "출력 형식이 잘못되었습니다"가 떴었는데, 이는 문제의 출력 조건인 "1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다."를 못 보고 한 줄에 다 출력해서 한 실수😱
    문제를 꼼꼼하게 읽는 것이 중요!

좋은 웹페이지 즐겨찾기