문제
비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
- add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
- remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
- check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
- toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
- all: S를 {1, 2, ..., 20} 으로 바꾼다.empty: S를 공집합으로 바꾼다.
입력
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
출력
check 연산이 주어질때마다, 결과를 출력한다.
문제 풀이
집합 문제는 해결하는 것은 어렵지 않았으나
시간 초과 문제가 발생해서 여러가지 시도를 해보았다.
먼저, 입력의 형태를 보면 add, remove, check, toggle은 숫자와 함께 연산이 주어지고
all, empty는 숫자 없이 연산이 주어진다.
처음에는 입력의 형태 구분을 하지 않았었는데 시간 초과 문제가 발생했다.
따라서 입력의 형태에 따라 구분하여 효율성을 높여주었다.
- add 연산이 입력되었을 때는 add() 함수를 이용해 숫자를 집합에 삽입해주었다.
집합 자료형은 중복을 자동으로 제거해주기 때문에 그냥 삽입해도 상관없다.
- remove 연산이 입력되었을 때는 discard() 함수를 이용해 숫자를 제거해주었다.
이때, remove() 함수 대신 discard() 함수를 사용해야 하는 이유는
discard() 함수는 remove() 함수와 달리 집합에 해당 숫자가 없으면 해당 연산을 무시하기 때문이다.
- check 연산이 입력되었을 때는 숫자가 집합에 있다면 1 없다면 0을 출력하도록 해주었다.
- toggle 연산이 입력되었을 때는 숫자가 집합에 있다면 제거, 없다면 삽입하도록 해주었다.
- all 연산이 입력되었을 때는 1~20 까지의 수를 포함하는 집합으로 집합을 다시 정의해주었다.
- empty 연산이 입력되었을 때는 clear() 함수를 이용해 집합을 공집합으로 만들어주었다.
My Code
import sys
input = sys.stdin.readline
m = int(input()) # 연산의 수
S = set() # 집합 S
for _ in range(m):
x = input().split()
# 길이가 1인 연산일 때
if len(x) == 1:
if x[0] == 'all':
S = set([i for i in range(1, 21)])
elif x[0] == 'empty':
S.clear()
# 길이가 1보다 큰 연산일 때
else:
tmp, num = x[0], int(x[1])
if tmp == 'add':
S.add(num)
elif tmp == 'remove':
S.discard(num)
elif tmp == 'check':
if num in S: print(1)
else: print(0)
elif tmp == 'toggle':
if num in S: S.discard(num)
else: S.add(num)
'백준(Python) 풀이' 카테고리의 다른 글
백준 11659번. 구간 합 구하기 4 (Python / 파이썬) (0) | 2022.07.08 |
---|---|
백준 17218번. 비밀번호 만들기 (Python / 파이썬) (0) | 2022.07.07 |
백준 1620번. 나는야 포켓몬 마스터 이다솜 (Python / 파이썬) (0) | 2022.07.07 |
백준 1074번. Z (Python / 파이썬) (0) | 2022.07.07 |
백준 10250번. ACM 호텔 (Python / 파이썬) (0) | 2022.07.05 |
댓글