반응형
🅰 백준 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 |
댓글