🔗 문제 링크
📝 풀이 과정
입력 범위(1 <= x <= 20)가 매우 작아 배열 등도 사용이 가능하지만, all
과 empty
등을 한번에 할 수 있는 비트연산을 활용하기로 했다.
add는 x를 추가하기 때문에 1 << x
와 OR
연산을 활용해 추가해준다.
remove는 x를 제거하기 위해 1 << x
를 ~
(not)연산을 사용해 비트를 뒤집어 AND
연산을 해준다.
check는 x의 체크 여부를 확인하기 위해 1 << x
와 마스킹한 값을 AND
연산하여 0이 아니라면 값이 존재한다는 뜻이므로 1을 Stringbuilder에 추가해준다.
toggle 연산은 x의 연산을 뒤집어야 하므로 1 << x
와 XOR
연산을 사용한다.
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);
}
}
📊 제출 결과
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준] 11726번: 2×n 타일링 - JAVA (1) | 2020.12.15 |
---|---|
[백준] 11724번: 연결 요소의 개수 - JAVA (0) | 2020.12.14 |
[백준] 11403번: 경로 찾기 - JAVA (0) | 2020.12.14 |
[백준] 1074번: Z - JAVA (0) | 2020.12.14 |
[백준] 11399번: ATM - JAVA (0) | 2020.12.13 |