본문 바로가기

알고리즘 풀이/백준

[백준] 11723번: 집합 - JAVA

🔗 문제 링크

BOJ 11723번: 집합

 

11723번: 집합

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

www.acmicpc.net

 

📝 풀이 과정

입력 범위(1 <= x <= 20)가 매우 작아 배열 등도 사용이 가능하지만, allempty 등을 한번에 할 수 있는 비트연산을 활용하기로 했다.

 

add는 x를 추가하기 때문에 1 << x와 OR 연산을 활용해 추가해준다.
remove는 x를 제거하기 위해 1 << x~(not)연산을 사용해 비트를 뒤집어 AND 연산을 해준다.
check는 x의 체크 여부를 확인하기 위해 1 << x와 마스킹한 값을 AND 연산하여 0이 아니라면 값이 존재한다는 뜻이므로 1을 Stringbuilder에 추가해준다.
toggle 연산은 x의 연산을 뒤집어야 하므로 1 << xXOR연산을 사용한다.
all은 모든 비트를 체크해야하기 때문에 (1 << 21) - 1로 값을 변경해준다.
empty는 공집합이므로 0으로 값을 변경한다.

 

input을 처리할 때, 'all'과 'empty'는 x의 입력을 받지 않기 때문에 swtich로 먼저 처리해 주었다. 다른 연산은 앞의 swtich의 default로 빼주고, x의 입력을 처리하였다.

 

💻 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int M = Integer.parseInt(br.readLine());

        int s = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < M; i++) {
            String[] input = br.readLine().split(" ");

            switch (input[0]) {
                case "all":
                    s = (1 << 21) - 1;
                    break;
                case "empty":
                    s = 0;
                    break;
                default:
                    int x = Integer.parseInt(input[1]);
                    switch (input[0]) {
                        case "add":
                            s |= (1 << x);
                            break;
                        case "remove":
                            s &= ~(1 << x);
                            break;
                        case "check":
                            sb.append((s & (1 << x)) != 0 ? 1 : 0).append('\n');
                            break;
                        case "toggle":
                            s ^= (1 << x);
                            break;
                    }
            }
        }

        System.out.println(sb);
    }
}

 

📊 제출 결과