(Java) 백준 11723번 - 집합

코딩너구리·2026년 1월 29일

코딩 문제 풀이

목록 보기
193/266

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를 공집합으로 바꾼다.

접근

map을 사용하여 기능을 구현한다.
all 명령어와 empty명령어는 입력으로 x가 들어오지 않기 때문에 StringTokenizer때문에 먼저 처리해준다.
이제 else문으로 x를 쓰는 기능을 구현해준다.
st.nextToken으로 x를 잡아주고 add, remove, check, toggle 명령어에 공통으로 사용한다.
문제에서 주어진 있는경우,없는 경우는 containsKey명령어를 사용하여 검증하고 반환 결과에 따라 처리해준다.

문제해결

> 들어온 x를 key값으로 가지며 value로는 있나 없나만 따질것이므로 1을 넣기위해 integer로 준다.
> StringTokenizer에 들어온 입력의 명령어부를 일단 cmd로 잡는다.
> all, empty는 x를 쓰지 않으므로 if와 elseif문으로 처리해준다.
> all은 반복문으로 20까지 map S에서 value값 1로 추가하고
> empty는 S.clear()로 맵을 비워준다.
> 이제 else로 x를 쓰는 명령어를 한꺼번에 처리한다. 명령어 다음으로 들어온 x를 한꺼번에 처리하기 위해서이다.
> switch문으로 명령어 별로 기능을 나눠준다.
> containsKey로 x인 key값이 있나 보고 있으면 remove에선 x값을 제거하고, 없으면 add에선 추가한다.
> check에선 있으면 1을 출력하고 없으면 0을 출력한다.
> toggle은 있으면 제거하고 없으면 put으로 S에 넣어준다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //11723번 집합
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Map<Integer, Integer> S = new HashMap<>();
        int M = Integer.parseInt(br.readLine());
        while(M-->0)
        {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String cmd = st.nextToken();
            if(cmd.equals("all")) for(int i = 1; i <= 20; i++) S.put(i, 1);
            else if(cmd.equals("empty")) S.clear();
            else
            {
                int x = Integer.parseInt(st.nextToken());
                switch (cmd) {
                    case "add" :
                        if (!S.containsKey(x)) S.put(x, 1);
                        break;
                    case "remove" :
                        if (S.containsKey(x)) S.remove(x);
                        break;
                    case "check" :
                        if(S.containsKey(x)) sb.append(1).append('\n');
                        else sb.append(0).append('\n');
                        break;
                    case "toggle" :
                        if(S.containsKey(x)) S.remove(x);
                        else S.put(x, 1);
                        break;
                }
            }
        }
        System.out.print(sb);
    }
}

후기

Map의 .명령어들을 알아보고 사용해볼 수 있는 기회였다.
intellij에서 switch문을 알아서 리팩토링 해줬는데 그게 백준의 java 11버전과 맞지않아 컴파일 에러가 났다.

0개의 댓글