https://www.acmicpc.net/problem/11723
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
add 조건을 보고 set으로 풀어야겠단 생각이 들었다.
일일이 확인해주는 것보다 애초에 중복을 허용하지 않은 set을 선택했고,
문제 자체에서도 set을 요구하고 있음을 느꼈다.
해야 할 연산의 수가 정말 많았고 시간이 넉넉하지 않단 생각이 들어 시간단축을 신경썼다.
첫번째 if문으로 리스트 길이를 확인해준 것도 같은 이유다.
조금이라도 줄여보고자 if문을 넣었는데, 이게 이득이었는진 확인하지 않았다..
여느 스택 문제처럼 set에 대해 공부한다면 무난하게 풀 수 있었다.
짚고 넘어갈 부분이 있다면 "remove" 명령문에서 remove 함수를 사용하지 않고 discard 함수를 썼단 점.
그리고 toggle에선 remove 함수를 사용해줬다.
두 함수의 차이는 에러의 유무였다.
discard는 지워야 할 인덱스 값이 존재하지 않으면 에러를 발생시킨다.
remove는 같은 조건에서도 에러를 발생시키지 않고 그냥 넘어간다.
"remove" 명령은 x값이 들어있다면 지우고, 없다면 무시하면 되는 조건이었다.
그렇기 때문에 discard를 사용해줬고,
toggle은 무시할 수 없는 조건이었기 때문에
try-except을 이용해 만약 set에 들어있지 않아 except을 일으킨다면 값을 추가해주는 식으로 구현했다.
al이라는 set을 먼저 만들어준 것도 시간을 단축시켜보고자 시도해봤다.
애초에 1부터 20이 들어있는 set인 al을 만들어두고, "all"이라면 al을 메인 set인 S에 복사했다.
import sys
S = set()
al = set(s for s in range(1, 21))
M = int(input())
for m in range(M):
target = sys.stdin.readline().split()
if len(target) == 1:
if target[0] == "all":
S = al
elif target[0] == "empty":
S.clear()
else:
x = int(target[1])
if target[0] == "add":
S.add(x)
elif target[0] == "remove":
S.discard(x)
elif target[0] == "check":
print(1 if x in S else 0)
elif target[0] == "toggle":
try:
S.remove(x)
except:
S.add(x)
'[Python]BaekJoon.AC' 카테고리의 다른 글
[Python]백준 BaekJoon.AC 1764 : 듣보잡(set, sorted()) (0) | 2022.02.01 |
---|---|
[Python]백준 BaekJoon.AC 1676 : 팩토리얼 0의 개수(for문, while문) (0) | 2022.01.31 |
[Python]백준 BaekJoon.AC 1620 : 나는야 포켓몬 마스터 이다솜(dict, isdigit()) (0) | 2022.01.30 |
[Python]백준 BaekJoon.AC 2805 : 나무 자르기(python3으로) (0) | 2022.01.28 |
[Python]백준 BaekJoon.AC 1966 : 프린터 큐(queue) (0) | 2022.01.27 |
[Python]백준 BaekJoon.AC 1874 : 스택 수열(스택) (0) | 2022.01.26 |
[Python]백준 BaekJoon.AC 1654 : 랜선 자르기(이진탐색, 런타임 에러) (0) | 2022.01.25 |
[Python]백준 BaekJoon.AC 11866 : 요세푸스 문제0(deque, join()) (0) | 2022.01.24 |