실버 V
https://www.acmicpc.net/problem/11723
11723번: 집합
첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.
www.acmicpc.net
문제
비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.
접근 방법
HashMap을 사용하여 중복을 포함하지 않는 배열을 만들었다. 또한, print를 사용하였을 때 시간초과 문제를 해결하기 위해 StringBuilder를 사용하여 출력하였다.
코드
package 대기업코테유형;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class SLIVER5_BJ11723 {
/*https://www.acmicpc.net/problem/11723
집합
*/
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//M입력
int M = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
Set<Integer> set = new HashSet<>(); // 중복 허용 X
for (int i = 0; i < M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String str = st.nextToken();
int x = 0;
switch (str) {
case "add" :
x = Integer.parseInt(st.nextToken());
set.add(x);
break;
case "remove" :
x = Integer.parseInt(st.nextToken());
set.remove(x);
break;
case "check" :
x = Integer.parseInt(st.nextToken());
if (set.contains(x))
sb.append("1\n");
else
sb.append("0\n");
break;
case "toggle" :
x = Integer.parseInt(st.nextToken());
if (set.contains(x))
set.remove(x);
else
set.add(x);
break;
case "all" :
for (int k = 0; k < 20; k++) {
set.add(k + 1);
}
break;
case "empty" :
set.clear();
break;
}
}
System.out.println(sb.toString());
}
}
NOTE
다른 사람들의 풀이과정을 보니 비트마스킹을 이용하여 푼 사람들이 많은 것 같다.
비트마스킹 알고리즘 공부가 더 필요할 것 같다. 또한, stringbuilder를 사용해 출력하는 연습의 필요성을 느꼈다.
비트마스크 (BitMask) 알고리즘
[목차] 1. 비트마스크(BitMask)란? 2. 비트마스크의 장점 3. 비트 연산자 4. 비트마스크를 이용한 집합 구현 * 종만북에 잘 설명되어 있어 기본적으로 종만북의 설명을 따릅니다. 1. 비트마스크(BitMask)
rebro.kr