JAVA/백준

백준 11723번: 집합

부리와 깃털 2024. 4. 30. 18:58
728x90
반응형

https://www.acmicpc.net/problem/11723

빈 공집합 S에 여러 연산을 수행하는 프로그램을 만드는 문제이다.

  1. add x: S에 x를 추가한다. x가 이미 있는 경우에는 무시한다.
  2. remove x: S에 x를 제거한다. x가 없는 경우에는 무시한다.
  3. check x: S에 x가 있으면 1, 없으면 0을 출력한다.
  4. toggle x: S에 x가 있으면 제거, 없으면 추가한다.
  5. all: S를 {1, 2, , ..., 20}으로 바꾼다.
  6. empty: S를 공집합으로 바꾼다(S를 비운다).

기존에 비슷한 문제처럼 switch - case로 연산을 만들었다.

또한 StringTokenizer로 한 줄로 연산을 받고 따로따로 나눠서 연산을 수행해주었다.

집합은 HashSet으로 만들고, 구현도 그 메소드를 이용해서 만들어냈다.

전에 BufferedWriter로 출력을 모았다가 틀렸던 경험이 있어서,

그때 문제를 해결하기 위해 했던 것과 똑같이 StringBuilder로 출력을 모아 큰 문자열을 만들어주었다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.util.HashSet;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();
    HashSet<Integer> hs = new HashSet<>();
    int N = Integer.parseInt(br.readLine());
    for (int i = 0; i < N; i++) {
      StringTokenizer st = new StringTokenizer(br.readLine());
      switch (st.nextToken()) {
        case "add": 
          hs.add(Integer.parseInt(st.nextToken()));
          break;
        case "remove": 
          hs.remove(Integer.parseInt(st.nextToken()));
          break;
        case "check": 
          if (hs.contains(Integer.parseInt(st.nextToken()))) sb.append("1\n");
          else sb.append("0\n");
          break;
        case "toggle" :
          int tog = Integer.parseInt(st.nextToken());
          if (hs.contains(tog)) hs.remove(tog);
          else hs.add(tog);
          break;
        case "all": 
          hs.clear();
          for (int j = 1; j <= 20; j++) hs.add(j);
          break;
        default: hs.clear();
      }
    }
    br.close();

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    bw.write(String.valueOf(sb));
    bw.flush();
    bw.close();
  }
}

 

반응형