곽로그

[백준 11723, Java] 집합 본문

알고리즘/백준

[백준 11723, Java] 집합

일도이동 2021. 4. 29. 21:29
반응형

문제

www.acmicpc.net/problem/11723

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

 

풀이

switch문을 이용해서 명령문 마다 분기하는 것까지는 다 비슷할 것 같다. 여기서는 집합을 어떻게 표시할 것인지에 따라서 풀이가 달라질 것 같다. 

 

"S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다."를 보고서 HashSet으로 풀어야 겠다 생각했다. x가 이미 있는 상태에서 add를 해도 무시되기 때문이다.  나머지 명령어들도 hash에서 제공되는 메서드를 이용하면 쉽게 풀 수 있다. 

 

 이전에는 크기가 21인 boolean[] array 배열을 선언해서 인덱스가 x 라 생각하고, x가 존재하면 array[x] = true라고 생각해서 풀었었다. 

 

코드

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


public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;
        HashSet<Integer> set = new LinkedHashSet<>();

        int M = Integer.parseInt(br.readLine());
        for(int m = 0;m<M; m++){
            st = new StringTokenizer(br.readLine()," ");
            String command = st.nextToken();
            int x = 0;

            switch (command){
                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)) bw.write("1\n");
                    else bw.write("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 num = 1; num<=20; num++){
                        set.add(num);
                    }
                    break;
                case "empty" :
                    set.clear();
                    break;
            }

        }

        bw.flush();
    }
}

 

 

코드

반응형
Comments