개발(코딩)/백준 문제풀이

[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의 존재 여부를 확인 한 뒤, 있으면 제거하고 없으면 추가합니다.