백준 구현 알고리즘 - 11723번(파이썬)
문제
풀이
import sys
n = int(sys.stdin.readline())
s = set()
for _ in range(n) :
array = sys.stdin.readline().strip().split()
if len(array) == 1:
if array[0] == "all":
s = set([i for i in range(1, 21)])
else:
s = set()
else:
func, x = array[0], array[1]
x = int(x)
if func == "add":
s.add(x)
elif func == "remove":
s.discard(x)
elif func == "check":
print(1 if x in s else 0)
elif func == "toggle":
if x in s:
s.discard(x)
else:
s.add(x)
후기
여태까지 푼 문제들 중에 가장 많이 틀리고
가장 많은 오류를 발생시킨 문제인 것 같다 ㅎㅎ..
실제 오류 내역인데
런타임 에러부터 시간 초과, 메모리 초과까지 정말 다양하게 오류를 냈다.. ㅎㅎ
결과적으로 내 코드는 돌아가는데
오류가 나니까 어떻게 해야할 지 답답했던 문제였던 것 같다.
우선 이 문제에서 처음 set에서 데이터를 지우는데 'remove'를 사용했는데
이 경우 집합에 지우려는 데이터가 없는 경우 런타임 에러를 띄운다고 한다.
'discard'의 경우 해당 데이터가 없어도 오류가 발생하지 않는다고 하니
코테에서는 런타임 에러에 대비해 discard를 사용하려고 해야할 것 같다.
입력을 여러 개 받지 않아서 처음에 sys 라이브러리를 사용하지 않고
입력을 그냥 input()으로 받았더니 시간초과가 발생하여 sys 라이브러릴 사용하여
sys.stdin.readline()으로 입력을 받았더니 시간초과 문제는 해결할 수 있었고,
메모리 초과의 경우 초반에는 다음과 같이 for문을 두 번 사용해서 코드를 작성했는데
import sys
n = int(sys.stdin.readline())
s = set()
array = []
for i in range(n) :
array.append(list(sys.stdin.readline().strip().split()))
for i in range(len(array)) :
if array[i][0] == 'add' :
s.add(int(array[i][1]))
elif array[i][0] == 'check' :
if int(array[i][1]) in s :
print(1)
else :
print(0)
elif array[i][0] == 'remove' :
s.discard(int(array[i][1]))
elif array[i][0] == 'toggle' :
if int(array[i][1]) in s :
s.discard(int(array[i][1]))
else :
s.add(int(array[i][1]))
elif array[i][0] == 'all' :
for i in range(1, 21) :
s.add(i)
else :
s -= s
for문을 두 번 돌리면서 메모리가 오바되는 것 같아서
for문을 위에 풀이처럼 한 번으로 바꾸니까 문제가 해결됐다.
반복문 사용은 가급적 줄일 수 있는 방향으로 코드를 작성해야 할 것 같다.