백준 집합

KIMYEONGJUN·6일 전
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

check 연산이 주어질때마다, 결과를 출력한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader/BufferedWriter 버퍼를 사용하여 빠르게 입출력을 받는다.
int형 변수 S를 비트마스크로 사용 20개의 정수가 집합에 포함되어 있는지 20비트 정수의 각각 비트를 켜고 끔으로 나타나게했다.
각 명령어 처리:
add x : $S = S \mid (1 \ll (x-1))$
해당 숫자 x에 대응하는 비트를 1로 만든다.
remove x : $S = S \& \sim(1 \ll (x-1))$
해당 숫자 x 비트를 0으로 만든다.
check x : (S & (1 << (x-1))) != 0 인지 검사해서 1 또는 0을 출력한다.
toggle x : $S = S \oplus (1 \ll (x-1))$
해당 비트를 반전시킨다.
all : $S = (1 << 20) - 1$
20개의 모든 비트를 1로 설정해 집합이 1부터 20까지 모두 포함됨을 표시한다.
empty : S = 0으로 초기화해 공집합 상태로 만든다.
모든 작업 후 리소스 종료를 위해 br.close()를 호출한다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 11723번 문제
public class Main1313 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int M = Integer.parseInt(br.readLine());
        int S = 0; // 집합을 비트마스크 정수로 표현 (0 : 비어있음)

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

            int x = 0;
            if (input.length == 2) {
                x = Integer.parseInt(input[1]);
            }

            switch (cmd) {
                case "add":
                    // 해당 비트 1로 설정
                    S = S | (1 << (x - 1));
                    break;

                case "remove":
                    // 해당 비트 0으로 설정
                    S = S & ~(1 << (x - 1));
                    break;

                case "check":
                    // 해당 비트 검사 후 결과 출력
                    int result = (S & (1 << (x - 1))) != 0 ? 1 : 0;
                    bw.write(result + "\n");
                    break;

                case "toggle":
                    // 해당 비트 반전
                    S = S ^ (1 << (x - 1));
                    break;

                case "all":
                    // 1부터 20까지 모두 1로 세팅 (20비트 모두 1)
                    S = (1 << 20) - 1;
                    break;

                case "empty":
                    // 모두 0으로 초기화
                    S = 0;
                    break;
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글