[BOJ] 집합

Minsu Han·2022년 9월 22일
0

알고리즘연습

목록 보기
20/105

코드

import sys
input = sys.stdin.readline

N = int(input())
s = 0b00000000000000000000

for _ in range(N):
    l = input().split()
    if len(l) > 1: 
        req, x = l
        x = int(x)
    else: req = l[0]

    if req == 'add':
        s = s | (1 << (20-x))
    elif req == 'remove':
        s = s & ~(1 << (20-x))
    elif req == 'check':
        ret = s & (1 << (20-x))   # 결과가 0보다 크면 있음
        print(int(int(ret) > 0))
    elif req == 'toggle':        # XOR - 두 수가 다르면 1
        s = s ^ (1 << (20-x))
    elif req == 'empty':
        s = 0b0000
    elif req == 'all':
        s = 0b11111111111111111111
        

결과

image


풀이 방법

  • 배열이나 리스트로 접근하면 시간초과가 발생하는 문제이다
  • 비트마스킹을 사용하는 문제라고 한다. 파이썬에서는 숫자 앞에 0b를 붙여서 이진수를 표현한다.
  • 이진수의 자릿수에 0 또는 1로 특정 원소의 유무를 표현하는 문제이다
  • 원소 n의 유무를 n번째 자릿수에 표시하기 위해 1 << (20-n) 식을 사용하였다.

profile
기록하기

0개의 댓글