본문 바로가기
백준/완전탐색

백준 11723. 집합

by 29살아저씨 2021. 8. 26.
반응형

🅰 백준 11723. 집합

 

11723번: 집합

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

www.acmicpc.net

✏️ 문제 풀이

  • 비트마스크를 이용하여 푸는 문제이다
  • string.startsWith를 이용하여 각 문자열로 시작되면 데이터를 수정하게 하였다.
  • 각 문자열 마다 연산해야 할 x의 위치가 정해져 있기 때문에 string.subString을 이용하여 x부터 끝까지 문자열을 읽어서 int형으로 변환하였다
  • 변환 후 각 연산문자열에 맞춰 비트마스크를 이용하여 답을 구현하였다.

✏️ 소스코드

package bruteforce;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main_실버5_11723_손은성2 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int N = Integer.parseInt(br.readLine());
		int S = 0;
		for (int i = 0; i < N; i++) {
			String text = br.readLine();
			if (text.startsWith("add")) {
				S = S | (1 << Integer.parseInt(text.substring(4)));
			} else if (text.startsWith("remove")) {
				S = S & ~(1 << Integer.parseInt(text.substring(7)));
			} else if (text.startsWith("check")) {
				if ((S & (1 << Integer.parseInt(text.substring(6)))) != 0) {
					sb.append("1\n");
				} else
					sb.append("0\n");
			} else if (text.startsWith("toggle")) {
				S = S ^ (1 << Integer.parseInt(text.substring(7)));
			} else if (text.startsWith("all")) {
				int cnt = 0;
				while (++cnt != 21) {
					S = S | (1 << cnt);
				}
			} else if (text.startsWith("empty")) {
				S = 0;
			}
		}
		System.out.println(sb);
	}
}

 

✅ 후기

  • 비트마스크를 이용하면 데이터를 더 효율적으로 관리할 수 있다는 것을 배웠다. 앞으로 다양한 문제들을 풀 때 비트마스크를 적용하여 시간을 더 줄일 수 있도록 해야겠다. 그리고 startsWith와 subString을 배워서 따로 블로그에 정리 해두었다. 이 또한 시간을 더 줄이는데 도움을 주었다.

 

반응형

'백준 > 완전탐색' 카테고리의 다른 글

백준 9095. 1, 2, 3 더하기  (0) 2021.08.26
백준 10974. 모든 순열  (0) 2021.08.26
백준 10973. 이전순열  (0) 2021.08.26
백준 10972. 다음 순열  (0) 2021.08.26
백준 1476. 날짜 계산  (0) 2021.08.26

댓글