
내가 생각했을때 문제에서 원하는부분
첫째 줄에 수행해야 하는 연산의 수 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.