본문 바로가기
코테정복💫/파이썬 PYTHON

[백준/Python] 11723번 집합

by 옹쑥이 2023. 10. 7.

문제

비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.


풀이

import sys
input = sys.stdin.readline

m = int(input())
s = set()

for i in range(m):
    num = input().strip().split()
    if(num[0] == "all" or num[0] == "empty"):
        if(num[0] == "all"):
            s = set([j for j in range(1, 21)])
        else:
            s.clear()
    else:
        if(num[0] == "add"):
            if int(num[1]) not in s:
                s.add(int(num[1]))
        elif(num[0] == "check"):
            if int(num[1]) in s:
                print(1)
            else:
                print(0)
        elif(num[0] == "remove"):
            if int(num[1]) in s:
                s.remove(int(num[1]))
        elif(num[0] == "toggle"):
            if int(num[1]) in s:
                s.remove(int(num[1]))
            else:
                s.add(int(num[1]))

메모리 초과 방지로 set을 사용하여 풀이

 

 

참고🐣

비트마스킹으로 풀이는 하진않았으나 참고하면 좋을 듯 하여 관련 블로그 링크 첨부

https://velog.io/@1998yuki0331/Python-%EB%B9%84%ED%8A%B8-%EB%A7%88%EC%8A%A4%ED%82%B9-%EC%A0%95%EB%A6%AC

 

문제 출처

https://www.acmicpc.net/problem/11723