Python/백준

11723_집합

728x90

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

 

11723번: 집합

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

www.acmicpc.net

 

 

 

비트마스크를 공부해볼 수 있는 문제였다.

 

비트마스크란 쉽게 생각해서 배열들을 하나의 수로 나타낼 수 있는 기법이다.

 

예를들어서

 

{1 , 3 , 4 } 라는 배열이 있다고 생각해보자. 이를 2진수로 나타내면

 

1101 이런식으로 나타낼 수 있을 것이다. 1,3,4가 들어있기에 1,3,4번째 2진수가 1로 변환

이진수는 결국 십진수로 나타낼 수 있으므로 1,3,4 가들어있는 배열을 2진수로 나타낼 수 있는 것이다.

 

그렇다면 문제에서 원하는 연산들은 다 비트연산처리를 해서 표현할 수 있다.

 

import sys
input = sys.stdin.readline
m = int(input())
S=0
for _ in range(m):
    order = input().rstrip()

    if order =="all":
        S = (1<<20)-1;
    elif order =="empty":
        S = 0;
    else:
        order,num = order.split()
        num = int(num)-1

        if order=="add":
            S |= (1<<num)
        elif order=="check":
                print(1 if S & (1<<num) else 0)
        elif order=="toggle":
            S ^= (1<<num)
        elif order=="remove":
            S &= ~(1<<num)

 

 

해당문제는 pyp3로 풀면 풀리지 않는다... 그리고 이러한 방식보다 그냥 리스트를 만들어서 해결해도 메모리 제한이 걸리지 않아 풀리긴 하나, 그래도 비트마스크가 무엇인지 이해하고 풀어보는거에 의미를 두었다.

728x90

'Python > 백준' 카테고리의 다른 글

17404_RGB거리2  (0) 2022.06.01
2098_외판원순회 1  (0) 2022.05.31
2162_선분그룹  (0) 2022.05.26
11758_CCW  (0) 2022.05.22
2166_다각형의 면적  (0) 2022.05.21