백준 1244 스위치 켜고 끄기
https://www.acmicpc.net/problem/1244
1244번: 스위치 켜고 끄기
첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩
www.acmicpc.net
코드
성공 코드 - 메모리 30616KB , 시간 36ms , 코드길이 866B
import sys
switch_n = int(sys.stdin.readline().rstrip())
switch = list(map(int, sys.stdin.readline().rstrip().split()))
n = int(sys.stdin.readline().rstrip())
for _ in range(n):
gender, num = map(int, sys.stdin.readline().rstrip().split())
if gender == 1: # 남자일 경우
for i in range(num-1 , switch_n , num):
switch[i] = int(not switch[i])
elif gender == 2: # 여자일 경우
for i in range(1, switch_n+1//2):
if (num-1)-i < 0 or (num-1)+i > switch_n-1:
break
if switch[(num-1)-i] == switch[(num-1)+i]:
switch[(num-1)-i] = int(not switch[(num-1)-i])
switch[(num-1)+i] = int(not switch[(num-1)+i])
else:
break
switch[(num-1)] = int(not switch[(num-1)])
for i in range(0, switch_n , 20):
print(*switch[i:i+20])
남자일 경우는 num에서 시작해서 num으로 step을 뛰고 switch길이까지 배수를 알아내도록 했습니다.
- 여기서 주의할 점은 i가 0부터 시작하므로 num-1을 시작으로 두어야 한다는점이 있겠습니다.
여자일 경우는 num-1을 중간에 두고 앞뒤로 1씩 더해가며 같은지 확인하고, 다르다면 반복문을 탈출하도록 했습니다.
스위치를 바꾸는 코드는 모두 switch(n) = int(not switch(n)) 으로 통일했습니다. 스위치 변화를 함수로 구현해서 더 간단하게 할 수도 있겠습니다.
Try 1. 코드 길이 : 852B
여러번 시도했는데 인덱스에러, 출력형식 오류 등 많이 뜨더라고요.. ㅋㅋ
결국은 마지막 출력 때문에 틀린 거였습니다.
그래서 가장 처음에 제출한 코드 가져와봤습니다.
import sys
switch_n = int(sys.stdin.readline().rstrip())
switch = list(map(int, sys.stdin.readline().rstrip().split()))
n = int(sys.stdin.readline().rstrip())
for _ in range(n):
gender, num = map(int, sys.stdin.readline().rstrip().split())
if gender == 1: # 남자일 경우
for i in range(switch_n):
if (i+1) % num == 0:
switch[i] = int(not switch[i])
elif gender == 2: # 여자일 경우
for i in range(switch_n):
if switch[(num-1)-i] == switch[(num-1)+i]:
switch[(num-1)-i] = int(not switch[(num-1)-i])
switch[(num-1)+i] = int(not switch[(num-1)+i])
else:
break
if (num-1)-i == 0 or (num-1)+i == switch_n - 1:
break
switch[(num-1)] = int(not switch[(num-1)])
print(switch)
오류
- 출력형식의 오류 -> 조건 불만족
후기
Search 🔍
- 파이썬 리스트 요소 한번에 출력하기
list = [] 이라고 할 때, print(*list) 로 하면 리스트의 모든 요소를 띄어쓰기 있이 출력할 수 있습니다.
list = [1, 2, 3, 4]
print(*list) # 1 2 3 4
- 남자일 경우의 이 코드는 구글링으로 찾아보았습니다. 인덱스에러가 계속떠서 for문 모두 검색해봤는데 좋더라고요. for i in range(start, end, step)
for i in range(num-1 , switch_n , num):
switch[i] = int(not switch[i])
참고로 보통의 for문과 같이 end는 포함이 안 되나 봅니다.
for i in range(1, 10, 3):
print(i)
# 1 , 4 , 7 출력
- 위 두개를 합한 듯한 마지막 출력문
for i in range(0, switch_n , 20):
print(*switch[i:i+20])
깨달은 점 ❗
switch_n와 len(switch) 가 같다는 걸 다른 분의 코드를 보다가 까먹어버려서 블로그를 쓰다가 다시 깨달았습니다 ㅋㅋ
그래서 그 부분을 고쳐서 다시 올리려고 len(switch)을 썼는데, 메모리가 113112KB에 시간이 120ms이었습니다.
그런데 switch_n으로 썼을 때는 메모리가 30616KB에 시간이 36ms이었습니다.
같은 결과값인데도 len계산을 했다는 것 하나로 메모리가 대략 3배차이가 나고 시간이 4배 가량이 차이 난다는게 너무 신기했습니다. 실수였지만 이런 발견했다는게 너무 재밌습니다 ㅋㅋㅋ
'코딩테스트' 카테고리의 다른 글
[백준] 3048 개미 - python (1) | 2023.01.28 |
---|---|
[백준] 2870 수학숙제 - python (1) | 2023.01.27 |
[백준] 8896 가위 바위 보 - python (3) | 2023.01.26 |
[백준] 2223 금화 - python (2) | 2023.01.26 |
[Python] 백준 1018번 - '체스판 다시 칠하기' 풀이 (1) | 2023.01.25 |