Skip to content

Commit a1069ab

Browse files
committed
[Silver II] Title: 기차가 어둠을 헤치고 은하수를, Time: 600 ms, Memory: 75440 KB -BaekjoonHub
1 parent 9ce2dad commit a1069ab

2 files changed

Lines changed: 116 additions & 0 deletions

File tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# [Silver II] 기차가 어둠을 헤치고 은하수를 - 15787
2+
3+
[문제 링크](https://www.acmicpc.net/problem/15787)
4+
5+
### 성능 요약
6+
7+
메모리: 75440 KB, 시간: 600 ms
8+
9+
### 분류
10+
11+
비트마스킹, 구현
12+
13+
### 제출 일자
14+
15+
2025년 1월 24일 15:33:43
16+
17+
### 문제 설명
18+
19+
<p>N개의 기차가 어둠을 헤치고 은하수를 건너려고 한다.</p>
20+
21+
<p>기차는 20개의 일렬로 된 좌석이 있고, 한 개의 좌석에는 한 명의 사람이 탈 수 있다. </p>
22+
23+
<p>기차의 번호를 1번부터 N번으로 매길 때, 어떠한 기차에 대하여 M개의 명령이 주어진다.</p>
24+
25+
<p>명령의 종류는 4가지로 다음과 같다.</p>
26+
27+
<ul>
28+
<li>1 i x : i번째 기차에(1 ≤ i ≤ N) x번째 좌석에(1 ≤ x ≤ 20) 사람을 태워라. 이미 사람이 타있다면 , 아무런 행동을 하지 않는다.</li>
29+
<li>2 i x : i번째 기차에 x번째 좌석에 앉은 사람은 하차한다. 만약 아무도 그자리에 앉아있지 않았다면, 아무런 행동을 하지 않는다.</li>
30+
<li>3 i : i번째 기차에 앉아있는 승객들이 모두 한칸씩 뒤로간다. k번째 앉은 사람은 k+1번째로 이동하여 앉는다. 만약 20번째 자리에 사람이 앉아있었다면 그 사람은 이 명령 후에 하차한다.</li>
31+
<li>4 i : i번째 기차에 앉아있는 승객들이 모두 한칸씩 앞으로간다. k번째 앉은 사람은 k-1 번째 자리로 이동하여 앉는다. 만약 1번째 자리에 사람이 앉아있었다면 그 사람은 이 명령 후에 하차한다.</li>
32+
</ul>
33+
34+
<p>M번의 명령 후에 1번째 기차부터 순서대로 한 기차씩 은하수를 건너는데 조건이 있다.</p>
35+
36+
<p>기차는 순서대로 지나가며 기차가 지나갈 때 승객이 앉은 상태를 목록에 기록하며 이미 목록에 존재하는 기록이라면 해당 기차는 은하수를 건널 수 없다.</p>
37+
38+
<p>예를 들면, 다음 그림을 예로 들었을 때, 1번째 기차와 같이 승객이 앉은 상태는 기록되지 않았기 때문에 은하수를 건널 수있다. 2번째 기차와 같은 상태도 기록되지 않았기 때문에 2번째 기차도 은하수를 건널 수 있다. 3번째 기차는 1번째 기차와 승객이 앉은 상태가 같으므로 은하수를 건널 수 없다.</p>
39+
40+
<p style="text-align: center;"><img alt="" src="https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/15787/1.png" style="width: 392px; height: 213px;"></p>
41+
42+
<p>처음에 주어지는 기차에는 아무도 사람이 타지 않는다.</p>
43+
44+
<p>은하수를 건널 수 있는 기차의 수를 출력하시오.</p>
45+
46+
### 입력
47+
48+
<p>입력의 첫째 줄에 기차의 수 N(1 ≤ N ≤ 100000)과 명령의 수 M(1 ≤ M ≤ 100000)가 주어진다. 이후 두 번째 줄부터 M+1번째 줄까지 각 줄에 명령이 주어진다. </p>
49+
50+
### 출력
51+
52+
<p>은하수를 건널 수 있는 기차의 수를 출력하시오.</p>
53+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws IOException {
6+
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
7+
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
8+
9+
String[] split = reader.readLine().split(" ");
10+
int N = Integer.parseInt(split[0]);
11+
int M = Integer.parseInt(split[1]);
12+
13+
// 기차 배열 초기화
14+
int[][] arr = new int[N + 1][21];
15+
16+
// 명령 처리
17+
for (int i = 0; i < M; i++) {
18+
String[] line = reader.readLine().split(" ");
19+
int train = Integer.parseInt(line[1]);
20+
21+
switch (line[0]) {
22+
case "1": // 승차
23+
int seatToBoard = Integer.parseInt(line[2]);
24+
arr[train][seatToBoard] = 1;
25+
break;
26+
case "2": // 하차
27+
int seatToLeave = Integer.parseInt(line[2]);
28+
arr[train][seatToLeave] = 0;
29+
break;
30+
case "3": // 뒤로 이동
31+
for (int j = 20; j > 1; j--) { // 20번 칸까지 뒤로 이동
32+
arr[train][j] = arr[train][j - 1];
33+
}
34+
arr[train][1] = 0; // 1번 좌석은 빈 상태
35+
break;
36+
case "4": // 앞으로 이동
37+
for (int j = 1; j < 20; j++) { // 1번 칸부터 앞으로 이동
38+
arr[train][j] = arr[train][j + 1];
39+
}
40+
arr[train][20] = 0; // 20번 좌석은 빈 상태
41+
break;
42+
default:
43+
// 잘못된 명령어는 무시
44+
break;
45+
}
46+
}
47+
48+
// 중복된 상태 제거
49+
HashSet<String> set = new HashSet<>();
50+
for (int i = 1; i <= N; i++) {
51+
StringBuilder sb = new StringBuilder();
52+
for (int j = 1; j <= 20; j++) { // 좌석 상태만 문자열로 변환
53+
sb.append(arr[i][j]);
54+
}
55+
set.add(sb.toString()); // 중복된 배열 상태 제거
56+
}
57+
58+
// 결과 출력
59+
writer.write(set.size() + "\n");
60+
writer.flush();
61+
writer.close();
62+
}
63+
}

0 commit comments

Comments
 (0)