[알고리즘] 11723. 집합

2024. 2. 3. 20:30Algorithm/with Java

0. 문제

 

 

11723번: 집합

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

www.acmicpc.net

 


1. 문제 이해

 

  1. 메모리 제한 448MB. (java8 기준)
  2. 주어지는 x의 크기가 1 ≤ x ≤ 20라서 int 32비트로 부분집합을 충분히 표현할 수 있다.
  3. 비트 연산으로 풀기.

 


2. 제출

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

public class BOJ11723 {
    static int S = 0;
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuffer sb = new StringBuffer();

        String input;
        int x = 0;
        int m = Integer.parseInt(st.nextToken());
        for(int i=0; i<m; i++){
            st = new StringTokenizer(br.readLine());
            input = st.nextToken();
            switch(input) {
                case "add" :
                    x = Integer.parseInt(st.nextToken());
                    add(x);
                    break;
                case "remove" :
                    x = Integer.parseInt(st.nextToken());
                    remove(x);
                    break;
                case "check" :
                    x = Integer.parseInt(st.nextToken());
                    sb.append(check(x)).append("\n");
                    break;
                case "toggle" :
                    x = Integer.parseInt(st.nextToken());
                    toggle(x);
                    break;
                case "all" :
                    all();
                    break;
                case "empty" :
                    empty();
                    break;
            }

        }
        System.out.println(sb);
        br.close();
    }

    private static void add(int x) {
        int num = 1<<x;
        S = S | num;
    }

    private static void remove(int x) {
        int num = 1<<x;
        S = S & ~num;
    }

    private static int check(int x) {
        int num = 1 << x;
        if((S & num) != 0){
            return 1;
        } else{
            return 0;
        }
    }

    private static void toggle(int x) {
        S ^= (1 << x);
        // if(check(x)==1){
        //     remove(x);
        // }else{
        //     add(x);
        // }
    }

    private static void all() {
        S = -1;
    }

    private static void empty() {
        S =  0;
    }
}

 


'Algorithm > with Java' 카테고리의 다른 글

[Java] Heap  (0) 2024.02.18
[알고리즘] 12891. DNA 비밀번호  (0) 2024.02.03
[알고리즘] 2023. 신기한 소수  (0) 2024.02.03
[Java] Stack, Queue, Priority Queue  (0) 2024.02.03
[Java] 부분집합  (0) 2024.02.03