Hello, Freakin world!

[백준 11723번][Java] 집합 - 비트마스크 집합 연산 구현하기 본문

알고리즘/PS

[백준 11723번][Java] 집합 - 비트마스크 집합 연산 구현하기

johnna_endure 2020. 10. 3. 19:41

www.acmicpc.net/problem/11723

 

11723번: 집합

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

www.acmicpc.net

집합 요소를 삭제하는 연산의 구현이 조금 까다로운 면이 있다.

이를 구현하기 위해 모든 집합의 요소를 포함하는 111.. 11와 같이 1로 완전히 채워진 비트를 만들고, 지우려는 요소 위치의 원소를 XOR 연산을 통해 0으로 만들어 준다. 그리고 집합 S와 and 연산을 해주면 해당 요소가 지워진 집합을 얻을 수 있다.

 

 


import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	static int m, S=0;
	public static void main(String[] args) throws IOException {
		InputReader reader = new InputReader();
		m = reader.readInt();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < m; i++) {
			StringTokenizer st = new StringTokenizer(reader.readLine());
			String command = st.nextToken();
			if(st.hasMoreTokens()) {
				int n = Integer.parseInt(st.nextToken());
				if(command.equals("add")) {
					add(n);
				}
				if(command.equals("remove")) {
					remove(n);
				}
				if(command.equals("check")) {
					sb.append(check(n) + "\n");
				}
				if(command.equals("toggle")) {
					toggle(n);
				}
			}
			if(command.equals("all")) {
				all();
			}
			if(command.equals("empty")) {
				empty();
			}
		}
		if(sb.length() > 0) sb.deleteCharAt(sb.length()-1);
		System.out.println(sb.toString());
	}

	private static void empty() {
		S = 0;
	}

	private static void all() {
		S = (1 << 20) - 1;
	}

	private static void toggle(int n) {
		if(check(n) == 0) add(n);
		else remove(n);
	}

	private static int check(int n) {
		if((S & (1 << n-1)) == 0) return 0;
		return 1;
	}

	private static void remove(int n) {
		int all = (1 << 20)-1;
		int comp = all ^ (1 << n-1);
		S &= comp;
	}

	private static void add(int n) {
		S |= (1 << n-1);
	}

}
class InputReader {
	private BufferedReader br;

	public InputReader() {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	public InputReader(String filepath) {
		try {
			br = new BufferedReader(new FileReader(filepath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public List<Character> readLineIntoCharList() throws IOException {
		List<Character> l = new ArrayList<>();
		while(true) {
			int readVal = br.read();
			if(readVal == '\n' || readVal == -1) break;
			l.add((char)readVal);
		}
		return l;
	}

	public boolean ready() throws IOException {
		return br.ready();
	}

	public String readLine() throws IOException {
		return br.readLine();
	}
	public int readInt() throws IOException {
		return Integer.parseInt(readLine());
	}
	public Long readLong() throws IOException {
		return Long.parseLong(readLine());
	}
}
Comments