11723번: 집합 (비트 마스크 없이 시간 초과 해결)

시간 초과가 난 이유

  1. 비트마스크를 이용해 풀지 않았기 때문
  2. 파이썬 입력함수 중 input()을 사용했기 때문

시간 초과 해결방법1

원래 이 문제는 비트마스크를 이용하는 문제이다.
비트 마스크를 이용하면 시간 초과가 나지 않는다.
비트 마스크를 사용한 풀이

TIL/python
https://hyunjungc-dev.github.io/2021/05/28/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5%ED%95%A8%EC%88%98-%EB%B9%84%EA%B5%90/

이 문제의 경우, 비트 마스크를 사용하지 않은 풀이에서 파이썬의 입력함수에 따라 시간초과가 나기도하고 아니기도 해서 파이썬의 입력함수에 대해 TIL/python 에 정리했다. 원래는 비트 마스크를 이용하는 문제이니 그렇게 푸는 것이 맞다.

시간 초과가 난 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
m = int(input())
S = set()
for _ in range(m):
cmd = input()
if cmd == "all":
S = {i for i in range(1, 21)}

elif cmd == "empty":
S = set()
else:
cmd, x = cmd.split(' ')
x = int(x)
if cmd == "add":
S.add(x)
elif cmd == "check":
print(int(x in S))
elif cmd == "remove":
S.discard(x)
elif cmd == "toggle":
if x in S:
S.discard(x)
else:
S.add(x)

시간 초과 해결 방법 2

파이썬 입력함수 중 sys.stdin.readline()을 사용한다.
위 함수로 입력을 받을 경우 맨 끝에 개행문자(줄바꿈 문자 \n)을 포함하고 있음을 주의해야한다.

시간 초과를 해결한 코드

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
import sys

m = int(sys.stdin.readline())
S = set()
for _ in range(m):
cmd = sys.stdin.readline()

if cmd == "all\n":
S = {i for i in range(1, 21)}

elif cmd == "empty\n":
S = set()
else:
cmd, x = cmd.split(' ')
x = int(x)
if cmd == "add":
S.add(x)
elif cmd == "check":
print(int(x in S))
elif cmd == "remove":
S.discard(x)
elif cmd == "toggle":
if x in S:
S.discard(x)
else:
S.add(x)