코테/백준

[백준/JAVA] 11723번: 집합

imname1am 2023. 5. 31. 19:53
반응형

🔺 문제

 

11723번: 집합

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

www.acmicpc.net

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        int M = Integer.parseInt(br.readLine());
        
        List<Integer> list = new ArrayList<>();
        
        while(M --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            String s = st.nextToken();
            
            if(s.equals("all")) {
                list.clear();
                for(int i = 1 ; i <= 20 ; i++) {
                    list.add(i);
                }
            }
            else if(s.equals("empty")) {
                list.clear();
            }
            
            else {
                int x = Integer.parseInt(st.nextToken());    // 🔔
 
                if(s.equals("add")) {
                    if(!list.contains(x)) list.add(x);
                    else continue;
                }
                else if(s.equals("remove")) {
                    if(list.contains(x)) list.remove(Integer.valueOf(x));   // 🔔🔔
                    else continue;
                }
                else if(s.equals("check")) {
                    if(list.contains(x)) sb.append(1 + "\n");
                    else                 sb.append(0 + "\n");
                }
                else if(s.equals("toggle")) {
                    if(list.contains(x)) list.remove(Integer.valueOf(x));
                    else list.add(x);
                }
            }
        }
        System.out.println(sb);
    }
}
cs
✅ 해결 아이디어
- 집합을 ArrayList로 정의해 사용했다.
- all 하고 empty를 받는 경우는 문자열 하나만 받으니까 바로 위에서 따로 처리!
- 그 외 경우는 숫자도 같이 입력 받으니까 StringTokenizer로 숫자값 저장하고 add, check, remove, toggle 과정 수행

 

💥 유의사항

• 리스트에서 해당 객체를 삭제하려면 list.remove(Integer.valueOf(x)) 해 줘야 한다.

그냥 list.remove(x)하면 해당 인덱스의 객체를 삭제하는 거라서..

 

 

엄청난 메모리,,,,


🔺 다른 풀이들

- 비트마스크 문제라고..?!

 

[백준 11723 : JAVA] 집합 / 비트마스크

개요 이 문제는 비트 마스크의 기본적인 개념을 활용하면 풀이할 수 있는 문제이다. 처음에는 boolean[]을 선언해서 풀었다. boolean [20]을 선언하여 b [0] ▶ true이면 1이 있는 것, false이면 1이 없는 것

dragon-h.tistory.com

 

- 비트마스크 사용 (switch - case 문)

 

[백준] 11723번: 집합 - JAVA

🔗 문제 링크 BOJ 11723번: 집합 11723번: 집합 첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다. www.acmicpc

girawhale.tistory.com


💬 느낀 점

어려워 보여서 피하기만 했던 비트마스크...

이제는 마주칠 때가 되었다...

예제 더 보고 직접 풀어봐야디,,,ㅠ

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

✔ 비트마스킹을 이용한 집합 구현이 가장 대표적인 방법이라고 한다.

 

[Java] 비트(bit)와 비트마스크(bit mask)

비트 (bit) 비트(binary digit) : 데이터를 나타내는 최소 단위이다. 모든 데이터는 0과 1의 조합으로 구성되는데, 이 0또는 1이 하나의 비트이다. 1개의 비트는 두 가지 상태를 나타낼 수 있으므로, n비

myeongju00.tistory.com

 

반응형