💻 Algorithm

[JAVA] 백준 11723 - 집합

dlalwl_jpg 2023. 12. 21. 10:00

실버 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를 사용해 출력하는 연습의 필요성을 느꼈다.

https://rebro.kr/63

 

비트마스크 (BitMask) 알고리즘

[목차] 1. 비트마스크(BitMask)란? 2. 비트마스크의 장점 3. 비트 연산자 4. 비트마스크를 이용한 집합 구현 * 종만북에 잘 설명되어 있어 기본적으로 종만북의 설명을 따릅니다. 1. 비트마스크(BitMask)

rebro.kr