https://www.acmicpc.net/problem/15787
[풀이]
- 비트마스킹 유형의 문제였습니다.(물론, 비트마스킹 없이 단순 구현으로도 풀 수 있습니다.)
- 초기값은 0으로 두고, 좌석은 20자리이지만, 비트마스킹을 위해 21자리를 만듭니다.
- N개의 기차가 있으며 좌석은 1~20번째 자리가 있습니다.
- switch문으로 해당 명령이 어떤 것인지 구분했습니다.
- 특히, 3번 명령의 경우, 연산과정후, 20개의 범위 밖, 21번째에 값이 남아있으므로 그 값을 없애야 합니다.
- 전체 수가 21이므로 ((1<<21) - 1)을 해야합니다.
- HashSet 자료구조를 이용해서 건널 수 있는 기차의 수를 구했습니다.
(참고)비트마스킹 문제를 처음 풀어봐서 관련 블로그에서 공부했습니다.(블로그)
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
Set<Integer> trainSet = new HashSet<>();
st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] train = new int[N + 1];
int seat;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine(), " ");
int order = Integer.parseInt(st.nextToken());
int trainIdx = Integer.parseInt(st.nextToken());
switch (order) {
case 1: {
seat = Integer.parseInt(st.nextToken());
train[trainIdx] |= 1 << seat;
break;
}
case 2: {
seat = Integer.parseInt(st.nextToken());
train[trainIdx] &= ~(1 << seat);
break;
}
case 3: {
train[trainIdx] <<= 1;
train[trainIdx] &= ((1 << 21) - 1);
break;
}
case 4: {
train[trainIdx] >>= 1;
train[trainIdx] &= ~1;
break;
}
}
}
for (int i = 1; i <= N; i++) {
trainSet.add(train[i]);
}
System.out.println(trainSet.size());
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 2470번 : 두 용액(Java) (0) | 2021.09.09 |
---|---|
백준 10809번 : 알파벳 찾기(Java) (0) | 2021.09.06 |
백준 1940번 : 주몽(Java) (0) | 2021.09.05 |
백준 3273번 : 두 수의 합(Java) (0) | 2021.09.05 |
백준 1302번 : 베스트셀러(Java) (0) | 2021.09.05 |