본문 바로가기
백준

[백준] code.plus(브루트포스-비트마스크,JAVA)11723번, 집합

by 열정적인 이찬형 2022. 3. 29.

문제 링크

 

11723번: 집합

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

브루트 포스란.

모든 경우의 수를 대입시켜서 가장 알맞은 경우의 수를 결과로 출력하는 것입니다.

 

이 문제에 핵심은

1. 1~20까지 들어가는 집합이 존재한다.

2. 집합에는 1~20의 숫자가 존재하거나 존재하지 않을 수 있다.

3. 존재 유무에 따른 배열을 만들어 해결한다.(boolean 형)

 

배열

 

aggregate : 1~20의 숫자가 존재하는지 확인

 

입력값에 명령에 따라 aggregate의 배열을 변화시켜주었습니다.

 

명령어

 

add x

 

해당 x의 값을 존재하는 형태로 바꾸어야 하기 때문에 aggregate[x] = true로 바꾸어줍니다.

 

remove x

 

해당 x의 값이 존재하지 않아야 하기 때문에 aggregate[x] = false로 바꾸어줍니다.

 

check x

 

해당 x가 존재(true)이면 1, 존재하지 않으면(false) 0을 출력한다.(aggregate[x]의 값을 확인!)

 

toggle x

 

해당 x가 존재 유무에 따라 반대로 바꾸기 때문에 aggregate[x] = !aggregate[x]로 바꾸어줍니다.

 

all

 

1~20의 모든 숫자가 존재하기 때문에 Arrays.fill(aggregate, true)를 해주었습니다.

 

empty

 

1~20의 모든 숫자가 존재하지 않기 때문에 Arrays.fill(aggregate, false)를 해주었습니다.

 

※Arrays.fill(배열, 채울 값)의 형태의 명령어로 배열의 값을 채울 때 사용합니다.

문제에 해결알고리즘은

1. 명령어를 M개 받습니다.

2. 위에 내용대로 명령어를 처리해줍니다.

 

  • BufferedReader를 사용하여 입력 값을 저장하였습니다.
  • StringTokenizer를 통해 명령어를 저장하였습니다.
  • 명령어 설명 내용 그대로 알고리즘을 구현하였습니다.
  • BufferedWriter 명령어 실행되면서 출력되는 0과 1 저장하였습니다.
  • BufferedWriter에 저장된 값을 출력하였습니다.

 

결과 코드

import java.io.*;
import java.util.*;
public class Main{
	public static int M;	//명령어 개수
	public static boolean[] aggregate = new boolean[21];	//1~20 숫자 존재 여부
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //입력값 처리하는 BufferedReader
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        //결과값 출력하는 BufferedWriter
    	StringTokenizer st;
    	M = Integer.parseInt(br.readLine());
    	for(int i=0;i<M;i++) {		//명령어 M개만큼 받기
    		st = new StringTokenizer(br.readLine()," ");
    		String command = st.nextToken();
    		if(command.equals("all"))		//"all"입력시
    			Arrays.fill(aggregate, true);
    		else if(command.equals("empty")) 	//"empty"입력시
				Arrays.fill(aggregate, false);
    		else {
        			int value = Integer.parseInt(st.nextToken());
        			if(command.equals("add"))	//"add x"입력시
        				aggregate[value] = true;
        			else if(command.equals("remove"))	//"remove x"입력시
        				aggregate[value] = false;
        			else if(command.equals("check")) {	//"check"입력시
        				if(aggregate[value])
        					bw.write("1\n");
        				else
        					bw.write("0\n");
        			}else		//"toggle"입력시
        				aggregate[value] = !aggregate[value];
        			}
    		
    	}
    	bw.flush();		//결과 출력
    	bw.close();
    	br.close();
    }
}

댓글