[백준] 1244 파이썬 스위치 켜고 끄기 런타임 에러
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문을 이용했다.
- 먼저 converse(num)으로 해당 숫자부터 바꾸어주고, 그 다음엔 양쪽을 확인해주어야 한다.
- 먼저 왼쪽 인덱스는 무조건 인덱스가 0보다 크거나 같아야 하고, 오른쪽에 있는 인덱스는 전구 개수인 n보다는 인덱스가 작아야 한다.
- 2번 조건을 만족한다면 왼쪽과 오른쪽 인덱스에 해당하는 숫자가 서로 같을때 바꾸어주면 된다.
20칸 씩만 출력
for i in range(n):
print(switch[i], end=' ')
if (i + 1) % 20 == 0:
print()
if n % 20 != 0: # 마지막 줄에서 스위치 개수가 20개가 아니라면 줄바꿈 추가
print()
이거 빼먹으면 에러남... 꼭 조건 잘 읽어보기..
