개발(코딩)/백준 문제풀이
[Python] 백준 11723번 집합 (실버5)
아는 개 산책
2025. 3. 25. 16:06
문제
비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.
예제 입력
26
add 1
add 2
check 1
check 2
check 3
remove 2
check 1
check 2
toggle 3
check 1
check 2
check 3
check 4
all
check 10
check 20
toggle 10
remove 20
check 10
check 20
empty
check 1
toggle 1
check 1
toggle 1
check 1
예제 출력
1
1
0
1
0
1
0
1
0
1
1
0
0
0
1
0
풀이
집합(set)을 활용합니다.
더보기
Point
- 집합(set)
- sys.stdin.readline()
- 조건문
소스코드
import sys
def input():
return sys.stdin.readline()
s = set()
for _ in range(int(input())):
key = str(input()).strip()
if key == 'all':
s.clear()
for i in range(1,21):
s.add(i)
elif key == 'empty':
s.clear()
else:
key, x = key.split()
x = int(x)
if key == 'add':
s.add(x)
elif key == 'remove' and x in s:
s.remove(x)
elif key == 'check':
print(int(x in s))
elif key == 'toggle':
if x in s:
s.remove(x)
else:
s.add(x)
입력되는 값에 따라 경우를 나누고, Set의 성질을 이용하여 연산을 쉽게 풀어 봅시다.
Line 1~3
import sys
def input():
return sys.stdin.readline()
입력값을 연산의 수 M (1 ≤ M ≤ 3,000,000) 만큼 받아야 하기 때문에,
input() 함수를 sys.stdin.readline() 으로 대체합니다.
그냥 input()을 쓰게 되면, 시간초과가 일어납니다.
Line 5
s = set()
s에 연산을 진행하기 위해 빈 set으로 초기화해 줍니다.
Line 7~8
for _ in range(int(input())):
key = str(input()).strip()
연산의 수를 받아와 그만큼 반복해 input을 받아줍니다.
이 때, sys.stdin.readline()은 마지막의 개행문자(\n), 즉 엔터값도 입력되기 때문에, strip()을 사용하여 날려줍니다.
(ex. key = 'all\n' -> key.strip() = 'all' )
Line 9~28
if key == 'all':
s.clear()
for i in range(1,21):
s.add(i)
elif key == 'empty':
s.clear()
이제 두 가지 경우로 나뉘게 됩니다.연산 종류만 나오게 되는 경우(all, empty), 그리고 연산 종류와 함께 숫자가 input으로 주어지는 경우(add 1 등)입니다.
첫번째 경우부터 걸러줍니다.
- 입력값이 all인 경우, 집합 s를 다시 초기화 하여 1부터 20까지의 숫자를 집어넣습니다.
- 입력값이 empty인 경우, 집합 s를 비워줍니다.
else:
key, x = key.split()
x = int(x)
if key == 'add':
s.add(x)
elif key == 'remove' and x in s:
s.remove(x)
elif key == 'check':
print(int(x in s))
elif key == 'toggle':
if x in s:
s.remove(x)
else:
s.add(x)
이제 남은 두번째 경우는 연산 종류와 숫자를 분리해 주어야 합니다.
key와 x로 분리시켜준 후, 경우를 나눠줍시다.
- 입력값이 add인 경우, 집합 s에 입력값 x를 추가해줍니다. 이미 있는 경우, 집합의 특성 상 무시됩니다.
- 입력값이 remove인 경우, 집합 s에 x가 존재한다면, x를 제거합니다.
- 입력값이 check인 경우, s 에 x 가 존재하는 지 출력합니다. x in s 는 True / False 값이기 때문에, int로 변환합니다.
- 입력값이 toggle인 경우, 집합 s 에 x의 존재 여부를 확인 한 뒤, 있으면 제거하고 없으면 추가합니다.