백준 11723번 : 집합

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