https://www.acmicpc.net/problem/2174
풀이
특별할 거 없는 구현입니다. 다만, 행, 열 표기법이 익숙하지 않은 방식으로 제시되니 잘 변환하도록 합니다.
배운 점
이동을 한 후 벽 or 로봇에 부딪히는지 움직임 처리를 반복문을 쓰지 않고 한번에 이동을 시킨 후 체크를 하니 틀렸다. 유사한 문제가 있었는데, 그 때 그런 식으로 풀었던 경험이 독이 되었다.
역시 구현은 한번 집중 흐트러지면 디버깅이 지옥이 된다..
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import java.io.*;
import java.util.*;
public class Main {
static int[] dr = { 1, 0, -1, 0 };
static int[] dc = { 0, -1, 0, 1 };
static int A, B, N, M;
static int[][] robots, map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
map = new int[B+1][A+1];
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
robots = new int[N+1][3];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
robots[i][1] = Integer.parseInt(st.nextToken());
robots[i][0] = Integer.parseInt(st.nextToken());
// 처음 배치가 잘못된 경우는 없겠지?
map[robots[i][0]][robots[i][1]] = i;
char dir = st.nextToken().charAt(0);
if (dir == 'N') robots[i][2] = 0;
else if (dir == 'W') robots[i][2] = 1;
else if (dir == 'S') robots[i][2] = 2;
else robots[i][2] = 3;
}
boolean isFalse = false;
while (M-- > 0) {
st = new StringTokenizer(br.readLine());
int idx = Integer.parseInt(st.nextToken());
char command = st.nextToken().charAt(0);
int time = Integer.parseInt(st.nextToken());
if (isFalse) continue;
if (!execute(idx, command, time)) isFalse = true;
}
if (!isFalse) System.out.println("OK");
}
static boolean execute(int idx, char command, int time) {
if (command == 'L') {
robots[idx][2] = (robots[idx][2]+time) % 4;
} else if (command == 'R') {
robots[idx][2] = (robots[idx][2]+3*time) % 4;
} else {
int r = robots[idx][0], c = robots[idx][1];
int nr = r, nc = c;
for (int i = 0; i < time; i++) {
nr += dr[robots[idx][2]];
nc += dc[robots[idx][2]];
if (nr <= 0 || nr > B || nc <= 0 || nc > A) {
System.out.println("Robot " + idx + " crashes into the wall");
return false;
}
if (map[nr][nc] > 0 ) {
System.out.println("Robot " + idx + " crashes into robot " + map[nr][nc]);
return false;
}
}
robots[idx][0] = nr;
robots[idx][1] = nc;
map[nr][nc] = map[r][c];
map[r][c] = 0;
}
return true;
}
}
|
cs |
'PS > Implementation' 카테고리의 다른 글
백준 23288번: 주사위 굴리기 2 (Java) (0) | 2022.07.14 |
---|---|
백준 19237번: 어른 상어 (Java) (0) | 2022.07.07 |
백준 17106번: 빙고 (Java) (0) | 2022.06.29 |
백준 4991번: 로봇 청소기 (Java) (0) | 2022.06.27 |
백준 20057번: 마법사 상어와 토네이도 (Java) (0) | 2022.06.10 |