1. 문제
https://www.acmicpc.net/problem/11723
문제
비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
- add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
- remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
- check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
- toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
- all: S를 {1, 2, ..., 20} 으로 바꾼다.
- empty: S를 공집합으로 바꾼다.
입력
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.
둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
출력
check 연산이 주어질때마다, 결과를 출력한다.

2. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Set {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
boolean[] set = new boolean[21];
for (int i = 0; i < n; i++) {
StringTokenizer token = new StringTokenizer(br.readLine());
String command = token.nextToken();
int x = 0;
switch (command) {
case "add":
x = Integer.parseInt(token.nextToken());
set[x] = true;
break;
case "remove":
x = Integer.parseInt(token.nextToken());
set[x] = false;
break;
case "check":
x = Integer.parseInt(token.nextToken());
if (set[x]) {
sb.append("1").append("\n");
} else {
sb.append("0").append("\n");
}
break;
case "toggle":
x = Integer.parseInt(token.nextToken());
set[x] = !set[x];
break;
case "all":
for (int j = 0; j < set.length; j++) {
set[j] = true;
}
break;
case "empty":
for (int j = 0; j < set.length; j++) {
set[j] = false;
}
break;
default:
break;
}
}
System.out.println(sb);
}
}
3. 해설
- 1 ~ 20의 숫자만 주어지기 때문에 불리언으로 관리
4. 다른 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Set {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int set = 0;
for (int i = 0; i < n; i++) {
StringTokenizer token = new StringTokenizer(br.readLine());
String command = token.nextToken();
int x = 0;
switch (command) {
case "add":
x = Integer.parseInt(token.nextToken());
set |= (1 << x);
break;
case "remove":
x = Integer.parseInt(token.nextToken());
set &= ~(1 << x);
break;
case "check":
x = Integer.parseInt(token.nextToken());
System.out.println((set & (1 << x)) != 0 ? 1 : 0);
break;
case "toggle":
x = Integer.parseInt(token.nextToken());
set ^= (1 << x);
break;
case "all":
set = (1 << 21) - 1;
break;
case "empty":
set = 0;
break;
default:
break;
}
}
}
}
- int는 32 비트 이기 때문에 1 ~ 20 까지 주어지는 값에 대해서 boolean[] 처럼 사용할 수 있다
'Java > 알고리즘(코테)' 카테고리의 다른 글
백준 2596번 : 비밀편지 (0) | 2024.09.10 |
---|---|
백준 1746번 : 듣보잡 (1) | 2024.09.08 |
백준 18110번 : solved.ac (0) | 2024.09.05 |
백준 1966번 : 프린터 큐 (1) | 2024.09.03 |
백준 11866번 : 요세푸스 문제 0 (1) | 2024.09.01 |