| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ABAE
- GPT
- MySQL
- transformer
- ChatGPT
- 자연어처리
- 연구
- Bert
- leetcode
- NLP
- LLM
- 머신러닝
- deepseek
- 알고리즘
- 파이썬
- 분산
- Aspect
- gpt1
- outer join
- SQL 첫걸음
- paper review
- 프로그래머스
- 논문리뷰
- 코딩테스트
- 그래프
- dfs
- 가상환경
- SQL
- 백준
- join
- Today
- Total
huginn muninn
[백준] 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()
이거 빼먹으면 에러남... 꼭 조건 잘 읽어보기..

'코딩테스트' 카테고리의 다른 글
| [프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 SQL (0) | 2024.06.13 |
|---|---|
| [프로그래머스] 조건에 맞는 개발자 찾기 SQL (1) | 2024.04.19 |
| [백준] 1205 파이썬 등수 구하기_구현 (0) | 2024.04.09 |
| [백준] 스타트링크 5014 파이썬 에러 (1) | 2024.04.07 |
| [백준] 2493 탑 (0) | 2024.03.29 |