Programming/BOJ Solutions

[Java] BOJ 11723: 비트마스크 (BitMask)

funczun 2025. 2. 10. 02:10

들어가기에 앞서

 

 비트마스크란 컴퓨터의 비트를 이용해, 이진 데이터로 상태를 저장하고 처리하는 기법이다. 작은 메모리 공간으로 다양한 연산을 수행할 수 있기에 효율적인 알고리즘을 설계할 수 있다. 주로 플래그 설정, 집합의 요소 추적, 특정 비트에 대한 연산 등에 사용된다.



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Problem11723 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int m = Integer.parseInt(br.readLine());
        HashSet<Integer> set = new HashSet<>();

        while (m-- > 0) {
            st = new StringTokenizer(br.readLine());

            String option = st.nextToken();
            int value = 0;

            if (!option.equals("all") && !option.equals("empty")) {
                value = Integer.parseInt(st.nextToken());
            }

            switch (option) {
                case "add":
                    set.add(value);
                    break;
                case "remove":
                    set.remove(value);
                    break;
                case "check":
                    if (set.contains(value)) {
                        System.out.println(1);
                    } else {
                        System.out.println(0);
                    }
                    break;
                case "toggle":
                    if (set.contains(value)) {
                        set.remove(value);
                    } else {
                        set.add(value);
                    }
                    break;
                case "all":
                    for (int i = 1; i <= 20; i++) {
                        set.add(i);
                    }
                    break;
                case "empty":
                    set.clear();
                    break;
            }
        }
    }
}

▶ HashSet을 사용해 풀었지만 결과는 시간 초과로 인한 실패다.



 비트마스크 사용은 공간복잡도와 시간복잡도 측면에서 이점을 가진다.

 

 비트마스크는 1개의 정수로 모든 집합을 표현할 수 있어, HashSet 대비 메모리 사용이 효율적이다. 또한, 비트 연산은 매우 빠르기 때문에 각 연산의 시간복잡도는 모두 O(1)로 처리되어 시간복잡도 측면에서도 우위를 가진다.

 

 이번 집합 문제처럼 고정된 범위 (1부터 20까지) 일 때, 우리는 비트마스크를 사용해 볼 수 있다.


 비트마스크의 기본 연산자는 크게 4가지이고, 추가로 2가지를 더 알고 있으면 좋다.

 

1. & (비트 AND): 두 비트가 모두 1일 때 1을 반환한다.

2. | (비트 OR): 두 비트 중 하나라도 1이면 1을 반환한다.

3. ^ (비트 XOR): 두 비트가 다를 때 1을 반환한다.

4. ~ (비트 NOT): 비트를 반전시킨다.

5. << (비트 왼쪽 이동): 비트를 왼쪽으로 이동시킨다.

6. >> (비트 오른쪽 이동): 비트를 오른쪽으로 이동시킨다.

 

 이제 문제로 돌아가자.


아직 못 풀었어요.