https://www.acmicpc.net/problem/11723
💻 코드
import sys
m = int(input())
s = set()
for _ in range(m):
tmp = sys.stdin.readline().rstrip().split()
# command만 있을 경우
if len(tmp) == 1:
if tmp[0] == 'all':
s = set([i for i in range(1, 21)])
else:
s = set()
# command와 x가 존재할 때
else:
command, x = tmp[0], tmp[1]
x = int(x)
if command == 'add':
s.add(x)
elif command == 'remove':
s.discard(x)
elif command == 'check':
print(1 if x in s else 0)
elif command == 'toggle':
if x in s:
s.discard(x)
else:
s.add(x)
📝 풀이
원래 비트마스크 문제이지만 집합 자료형 set을 이용하여 먼저 풀어보았다.
집합 자료형에 관해서는 아래의 자료를 참고하였다.
먼저 명령어와 숫자를 입력을 받는데 명령어만 입력 받는 경우(empty, all)와 명령어와 숫자를 입력 받는 경우(add, remove, check, toggle)로 나누었다. 그리고 각 명령어에 대해서는 집합 자료형 관련 함수를 사용하여 쉽게 해결할 수 있었다.
keyError 오류
이 문제에서 주의해야하는 것이 있었는데 집합 자료형 관련 함수인 remove를 쓰면 오류가 난다는 것이었다.
KeyError 오류로, remove 메소드는 지우려는 요소가 없을 때 이 에러가 발생한다. remove 메소드 대신 discard 메소드로 작성하면 해결할 수 있다.
또 메모리 초과....
왜 계속 메모리 초과가 나오는지 정말 의문이었다. 다른 분들의 코드도 참고하고 여러 질문들을 검색해보았는데도 해결이 되지 않았다. 한참을 찾아 이 질문 글을 보고 해결을 할 수 있었다...
https://www.acmicpc.net/board/view/49894
이때까지 pypy3로 제출을 계속 해와서 그것으로 제출을 했었는데 그 답변 글에는 지금까지 pypy3으로 맞았습니다를 받은 사람이 한 명도 없고 현재 메모리 제한으로는 pypy3으로 맞았습니다를 받는 것이 불가능한 것으로 추정된다고 적혀있었다.
근데 현재를 기준으로 보면 pypy3으로 맞은 사람들이 많진 않지만 꽤 있었다. 그런데 거의 다 비트마스크로 문제를 풀어서 집합 자료형을 사용해서도 되는지는 확실하게 모르겠다. 다음에 비트마스크로 한 번 풀어봐야겠다.
다행히 그 다음에는 바로 python3으로 제출하여 맞았습니다를 받을 수 있었다.
'Algorithm 문제 풀이 > python' 카테고리의 다른 글
[python] 백준 1991번 트리 순회 (0) | 2022.08.02 |
---|---|
[python] 백준 1697번 숨바꼭질 (0) | 2022.08.01 |
[python] 백준 10972번 다음 순열 (0) | 2022.07.27 |
[python] 백준 2309번 일곱 난쟁이 (0) | 2022.07.25 |
[python] 백준 17087번 숨바꼭질 6 (0) | 2022.07.22 |