jyamethyst21 님의 블로그

백준 11723번- '집합' (PYTHON 풀이) 본문

CODING 💻

백준 11723번- '집합' (PYTHON 풀이)

jyamethyst21 2025. 12. 31. 01:41

문제:

 

이전에 스택, 큐, 덱 같은 자료구조를 코드로 만들었을 때랑 비슷한 유형이다.

하지만 이번엔 집합 문제이기 때문에 집합 형태로 만들어야 한다는 점은 다르다. 집합은 중복된 수가 존재하지 않는 형태이고, 리스트, 딕셔너리처럼 기본 자료형이기 때문에 알아둬야 한다.

 

설명대로 그대로 작성하면 되기 때문에 추가 설명은 생략하겠다.

 

풀이:

M = int(input())
li = set()

for i in range(M):
    a = list(input().split())
    if a[0] == 'add':
        li.add(int(a[1]))
    elif a[0] == 'remove':
        li.remove(int(a[1]))
    elif a[0] == 'check':
        if int(a[1]) in li:
            print(1)
        else:
            print(0)
    elif a[0] == 'toggle':
        if int(a[1]) in li:
            li.remove(int(a[1]))
        else:
            li.add(int(a[1]))
    elif a[0] == 'all':
        li = set(list(range(1,21)))
    elif a[0] == 'empty':
        li = set()

필자도 집합을 사용하기는 하지만 리스트만큼 자주 쓰지는 않아서, 관련 내장함수를 전부 외우고 있지는 않는다. 그래서 처음 문제를 보자마자 위처럼 쓰면 되는 것 아닌가 하는 생각에 이렇게 작성하였다.

하지만 이렇게 작성하면 런타임 에러가 난다. 그 이유는 remove 때문이다. remove는 괄호 안에 있는 값이 있을 경우 해당 값을 삭제하지만, 해당 값이 집합에 없는 경우는 에러를 발생시킨다.

그래서 이때 set에서 사용할 수 있는 내장함수가 discard이다. discard는 값이 있으면 삭제, 없어도 에러를 발생시키지 않는다.

 

import sys
M = int(sys.stdin.readline())
li = set()

for i in range(M):
    a = sys.stdin.readline().split()
    if a[0] == 'add':
        li.add(int(a[1]))
    elif a[0] == 'remove':
        li.discard(int(a[1]))
    elif a[0] == 'check':
        if int(a[1]) in li:
            print(1)
        else:
            print(0)
    elif a[0] == 'toggle':
        if int(a[1]) in li:
            li.discard(int(a[1]))
        else:
            li.add(int(a[1]))
    elif a[0] == 'all':
        li = set(list(range(1,21)))
    elif a[0] == 'empty':
        li = set()

discard를 사용해서 풀면 이번엔 시간초과가 나는데, 이때 import sys를 한 후 sys.stdin.readline()을 써서 입력값을 받으면 시간초과 없이 문제를 풀 수 있다.

이번 문제 덕분에 집합의 새로운 내장함수를 배울 수 있었다. 나머지는 스택, 큐 등과 같은 자료구조에서 썼던 함수가 비슷하기 때문에 'discard'에 대해서 알아두면 좋을듯하다.

 

아, 그리고 추가로 집합은 합집합, 교집합, 차집합과 관련된 연산자도 있다. 

합집합union() 또는 | , 교집합intersection() 또는 & , 차집합differencet() 또는 - 로 나타낸다.

나중에 문제에 나오면 좀 더 자세히 설명토록 하겠다.