본문 바로가기
알고리즘/백준 solved.ac PS

[백준][solved.ac][Silver 5][Python] 11723번 : 집합

by 빛밤하늘 2021. 5. 31.
반응형

밑의 링크는 백준에서의 문제 링크입니다.

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

 

 

 

 

 

 

 

 

파이썬 코드와 결과입니다.

# readline을 사용하기 위해 import합니다.
from sys import stdin

# 공집합 S를 만들어줍니다.
S = set()
# 첫째 줄에 수행해야 하는 연산의 수 M을 입력합니다.
# 1 <= M <= 3,000,000
# 정수형으로 변환합니다.
M = int(stdin.readline())

# 연산의 수 M만큼 반복합니다.
for calculation_idx in range(M):
    # 연산 한 줄을 입력합니다.
    # 공백으로 구분해줍니다.
    calculation = stdin.readline().rstrip().split(' ')

    # 연산이 add라면
    if calculation[0] == 'add':
        # x인 calculation[1]를 정수형으로 변환해서 집합 S에 추가합니다.
        S.add(int(calculation[1]))
    # 연산이 remove라면
    elif calculation[0] == 'remove':
        # x인 calculation[1]를 정수형으로 변환해서 집합 S에서 제거 시도해봅니다.
        try:
            # 집합 S에 x인 calculation[1]이 있다면 제거합니다.
            S.remove(int(calculation[1]))
        # calculation[1]이 집합 S에 없어서 KeyError가 뜬다면
        except KeyError:
            # 연산을 무시합니다.
            pass
    # 연산이 check라면
    elif calculation[0] == 'check':
        # 집합 S에 x인 정수형 calculation[1]이 있다면
        if int(calculation[1]) in S:
            # 1을 출력합니다.
            print(1)
        # 집합 S에 x인 정수형 calculation[1]이 없다면
        else:
            # 0을 출력합니다.
            print(0)
    # 연산이 toggle이라면
    elif calculation[0] == 'toggle':
        # # 집합 S에 x인 정수형 calculation[1]이 있다면
        if int(calculation[1]) in S:
            # 집합 S에서 x인 정수형 calculation[1]을 제거합니다.
            S.remove(int(calculation[1]))
        # # 집합 S에 x인 정수형 calculation[1]이 없다면
        else:
            # 집합 S에서 x인 정수형 calculation[1]을 추가합니다.
            S.add(int(calculation[1]))
    # 연산이 all이라면
    elif calculation[0] == 'all':
        # 집합 S를 정수 1부터 20까지 숫자로 채워줍니다.
        S = {number for number in range(1, 21)}
    # 연산이 empty라면
    elif calculation[0] == 'empty':
        # 집합 S를 공집합으로 만듭니다.
        S = set()

결과

 

맞았습니다 결과를 보고나서 시간이 너무 오래 걸리길래 다른 사람들의 파이썬 결과는 어떤지 찾아봤는데

문제 그대로의 명령들을 구현한 저의 코드와는 다른 방법으로 푼 코드들이 빠른 실행 시간의 결과를 냈습니다.

문제 카테고리를 확인해보니 비트마스킹을 의도한 문제였습니다.

 

저는 무작정 문제에 있는 명령들을 구현해서 풀려고 해서 비트마스킹은 생각이 나지 않았는데

비트마스킹으로 푸는 방법도 공부해봐야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글