티스토리 뷰
https://www.acmicpc.net/problem/2174
🐢 설명
로봇들이 2차원 공간에 존재하고 주어진 명령에 따라 움직인다. 이때 주의할 점은 좌표평면의 원점이 좌측 하단이라서 일반적인 2차원 배열의 인덱스와 다르다는 점이다.
하지만 굳이 신경쓰지 않고 그대로 사용해도 문제는 없는데 다만 그렇게 하려면 움직이라는 명령에서 방향은 변경을 해줘야 한다. 동, 서 쪽은 위아래가 반대여도 그대로이니 상관이없고 북쪽은 남쪽으로 / 남쪽은 북쪽으로 변경해주면 좌표값은 그대로 사용해도 무방하다.
로봇이 로봇이 부딫힌 경우에는 해당 로봇의 번호도 알려줘야 하므로 맵에 각 로봇의 번호를 적어놨고 이동할 때 같이 수정하도록 했다. 로봇들은 배열에 담아 놓은 후 주어진 로봇 번호로 접근하여 로봇을 움직이게 했다.
🐢코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 로봇시물레이션_2174 {
static int R, C, N, M, end;
static Robot[] robots = new Robot[101];
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
C = Integer.parseInt(st.nextToken());
R = Integer.parseInt(st.nextToken());
map = new int[R][C];
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken()) - 1;
int y = Integer.parseInt(st.nextToken()) - 1;
int dir = direction(st.nextToken());
robots[i + 1] = new Robot(y, x, dir);
map[y][x] = i + 1;
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int idx = Integer.parseInt(st.nextToken());
String order = st.nextToken();
int count = Integer.parseInt(st.nextToken());
move(idx, order, count);
if (end == -1) return;
}
System.out.println("OK");
}
private static void move(int idx, String order, int count) {
switch (order) {
case "L":
{
while (count-- > 0) {
robots[idx].dir = (robots[idx].dir + 1) % 4;
}
return;
}
case "R":
{
while (count-- > 0) {
robots[idx].dir = (robots[idx].dir - 1);
if (robots[idx].dir < 0) robots[idx].dir = 3;
}
return;
}
case "F":
{
while (count-- > 0) {
int tmp = go(idx);
if (tmp == -1) {
System.out.printf("Robot %d crashes into the wall", idx);
end = -1;
return;
} else if (tmp > 0) {
System.out.printf("Robot %d crashes into robot %d", idx, tmp);
end = -1;
return;
}
}
}
}
}
private static int go(int idx) {
int[] dy = {-1, 0, 1, 0};
int[] dx = {0, 1, 0, -1};
Robot robot = robots[idx];
map[robot.y][robot.x] = 0; // 이동시 적은 번호 지움
int ny = robot.y + dy[robot.dir];
int nx = robot.x + dx[robot.dir];
if (ny < 0 || nx < 0 || ny >= R || nx >= C)
return -1;
else if (map[ny][nx] > 0)
return map[ny][nx]; // 부딫힌 로봇의 번호를 반환
else {
map[ny][nx] = idx; // 맵에 번호 적어두기
robots[idx].y = ny;
robots[idx].x = nx;
return 0;
}
}
private static int direction(String nextToken) {
switch (nextToken) {
case "S": // 남쪽일 때 위로가게함 (좌표값을 그대로 사용하기 위해서)
return 0;
case "E":
return 1;
case "N": // 북쪽일 때 아래로 가게함
return 2;
case "W":
return 3;
}
return -1;
}
private static class Robot {
int y;
int x;
int dir;
public Robot(int y, int x, int dir) {
this.y = y;
this.x = x;
this.dir = dir;
}
}
}
🐢 마무리
반응형
'알고리즘 > 백준' 카테고리의 다른 글
(백준) 일감호에 다리 놓기 _ 17490 (0) | 2021.12.20 |
---|---|
(백준) 싸지방에간 준하 _ 12764 (1) | 2021.12.12 |
(백준) 불 _ 5427 (0) | 2021.12.08 |
(백준) 뱀 _ 3190 (0) | 2021.10.22 |
(백준) 마법사 상어와 파이어스톰 (0) | 2021.10.19 |
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday