CodingTest

(Java) 백준 11723번

Thunderland 2023. 8. 13. 22:53

백준 11723번 실버5 정답률 29.261%

문제

비어있는 공집합 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 연산이 주어질때마다, 결과를 출력한다.

 

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

public class Main {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Integer num = Integer.parseInt(br.readLine());
        Set<Integer> intSet = new HashSet<Integer>();
        for(int i = 0; i < num; i++) {
        	String input = br.readLine();
        	StringTokenizer st = new StringTokenizer(input, " ");
        	String token = st.nextToken();
        	Integer number = null;
        	if(!token.equals("all") && !token.equals("empty"))number = Integer.parseInt(st.nextToken());
        	switch(token) {
        		case "add" : 
        			intSet.add(number);
        			break;
        		case "remove" :
        			intSet.remove(number);
        			break;
        		case "check" :
        			bw.write((intSet.contains(number)? 1 : 0) + "\n");
        			break;
        		case "toggle" :
        			if(intSet.contains(number)) intSet.remove(number);
        			else intSet.add(number);
        			break;
        		case "all" :
        			for(int j = 1; j <= 20; j++) {
        				intSet.add(j);
        			}
        			break;
        		case "empty" :
        			intSet = new HashSet<Integer>();
        			break;
        	}
        }
        bw.flush();
        br.close();
        bw.close();
	}

}

동일한 숫자가 있는 경우 해당 연산을 무시하는 특성상 집합 Set에 해당하므로 java Set을 이용하여 구현하였습니다.

(1) add 명령어 : Set에 add하고 Set 특성상 동일한 값이 있는 경우 덮어씁니다.

(2) remove 명령어 : Set에서 remove합니다.

(3) check 명령어 : Set의 contains 명령어를 이용해 존재하는 지 확인합니다.

(4) toggle 명령어 : Set의 contains 명령어를 이용해 존재하면 remove하고 존재하지 않으면 add합니다.

(5) all 명령어 : 1~20까지의 숫자를 모두 add합니다. 이 때 동일한 값이 있는 경우 Set의 특성상 덮어씁니다.

(6) empty 명령어 : 공집합으로 바꾸기 위해 새로운 Set으로 선언합니다.

 

이상입니다. 지금까지 읽어주셔서 감사합니다.