huginn muninn

[백준] 1244 파이썬 스위치 켜고 끄기 런타임 에러 본문

코딩테스트

[백준] 1244 파이썬 스위치 켜고 끄기 런타임 에러

_maddy 2024. 4. 15. 20:42

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

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

 

문제 이해하는데도 오래걸리지 않았고, 코드 짜는데도 오래 안걸렸는데 왜 자꾸 런타임 에러가 나는지!!!!!!!!!!!! 아니면 출력 형식이 잘 못됐다고 출력되어서 푸는데 오래걸렸다...ㅠ

 

 

 

주의해야 할 조건은

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

 

즉, 스위치 개수가 20개가 넘으면 줄 넘김해서 다음 줄에 출력해야한다는 것. 

처음에 이 조건을 구현 안해서 에러가 났다. 

 

 

<최종 코드>

#1244 스위치 켜고 끄기

n = int(input())
switch = list(map(int, input().split()))

def converse(x):
    switch[x] = 1 - switch[x]

students = int(input())

for _ in range(students):
    sex, num = map(int, input().split())
    # 남학생
    if sex == 1:
        for i in range(num - 1, n, num):
            converse(i)
    # 여학생
    else:
        num -= 1  # 인덱스 조정
        converse(num)
        left = num - 1
        right = num + 1
        while left >= 0 and right < n and switch[left] == switch[right]:
            converse(left)
            converse(right)
            left -= 1
            right += 1

for i in range(n):
    print(switch[i], end=' ')
    if (i + 1) % 20 == 0:
        print()
if n % 20 != 0:  # 마지막 줄에서 스위치 개수가 20개가 아니라면 줄바꿈 추가
    print()

 

 

 

풀이 설명

 

0->1 1->0 함수 만들기

처음에 이 문제를 보자마자 든 생각은, 1을 0으로 0을 1로 바꾸는 함수를 만들어야 겠다고 생각했다.

def converse(x):
    switch[x] = 1 - switch[x]

 

 

남학생 여학생 따로 조건 분리

남학생과 여학생 조건이 다르니까 일단 남학생과 여학생 각각 if 문으로 분리했다. 

 

<남학생>

if sex == 1:
    for i in range(num - 1, n, num):
        converse(i)

 

남학생은 만들기 쉬웠다. 입력된 수가 3이라면 3칸 씩 확인하면 되기 때문. for문으로 해결 가능하다. 

 

<여학생>

# 여학생
else:
    num -= 1  # 인덱스 조정
    converse(num)
    left = num - 1
    right = num + 1
    while left >= 0 and right < n and switch[left] == switch[right]:
        converse(left)
        converse(right)
        left -= 1
        right += 1

 

입력된 번호와 인덱스간 차이가 있어서 은근히 번거롭다. 하지만 인지하고 코드짤 때 신경만 잘 써준다면 틀릴일 없다!

나는 while문을 이용했다. 

  1. 먼저 converse(num)으로 해당 숫자부터 바꾸어주고, 그 다음엔 양쪽을 확인해주어야 한다.
  2. 먼저 왼쪽 인덱스는 무조건 인덱스가 0보다 크거나 같아야 하고, 오른쪽에 있는 인덱스는 전구 개수인 n보다는 인덱스가 작아야 한다. 
  3. 2번 조건을 만족한다면 왼쪽과 오른쪽 인덱스에 해당하는 숫자가 서로 같을때 바꾸어주면 된다. 

 

20칸 씩만 출력

for i in range(n):
    print(switch[i], end=' ')
    if (i + 1) % 20 == 0:
        print()
if n % 20 != 0:  # 마지막 줄에서 스위치 개수가 20개가 아니라면 줄바꿈 추가
    print()

 

이거 빼먹으면 에러남... 꼭 조건 잘 읽어보기..