728x90
/**
* BOJ_2174 로봇 시뮬레이션
* https://www.acmicpc.net/problem/2174
* keyword -
*/
import java.io.*;
import java.util.*;
public class Main {
static class Robot {
int x, y, dir;
public Robot(int x, int y, char direction) {
this.x = x;
this.y = y;
this.dir = "NESW".indexOf(direction);
}
}
static int A, B;
static Map<Integer, Robot> robots = new HashMap<>();
static Set<String> occupied = new HashSet<>(); //현재 위치를 이미 로봇이 점유하고 있는지 확인
//방향 이동 (N, E, S, W) 순서
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0};
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());
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); //로봇 개수
int M = Integer.parseInt(st.nextToken()); //명령 개수
//로봇 초기 위치 배치
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
char dir = st.nextToken().charAt(0);
robots.put(i, new Robot(x, y, dir));
occupied.add(x + "," + y); //초기위치 저장
}
//명령 처리
for (int i = 0; i < M; i++) {
String commendLine = br.readLine();
st = new StringTokenizer(commendLine);
int robotId = Integer.parseInt(st.nextToken());
char command = st.nextToken().charAt(0);
int repeats = Integer.parseInt(st.nextToken());
String result = excuteCommand(robotId, command, repeats);
if (!result.equals("OK")) {
System.out.println(result);
return;
}
}
System.out.println("OK");
}
static String excuteCommand(int robotId, char command, int repeats) {
Robot robot = robots.get(robotId);
//명령 횟수 만큼 반복
for (int i = 0; i < repeats; i++) {
if (command == 'L') {
robot.dir = (robot.dir + 3) % 4;
} else if (command == 'R') {
robot.dir = (robot.dir + 1) % 4;
} else if (command == 'F') {
//앞으로 이동
int newX = robot.x + dx[robot.dir];
int newY = robot.y + dy[robot.dir];
//벽 충돌 획인
if (newX < 1 || newX > A || newY < 1 || newY > B) {
return "Robot " + robotId + " crashes into the wall";
}
//다른 로봇과의 충돌 확인
if (occupied.contains(robot.x + "," + robot.y)) {
// 현재 로봇과 충돌한 로봇 찾기
for (Map.Entry<Integer, Robot> entry : robots.entrySet()) {
if (entry.getValue().x == newX && entry.getValue().y == newY) {
return "Robot " + robotId + " crashes into robot " + entry.getKey();
}
}
}
//위치 업데이트
occupied.remove(robot.x + "," + robot.y); //이동전 위치 삭제
//로봇 현재 위치 업데이트
robot.x = newX;
robot.y = newY;
//로봇 위치 셋 -> 이동 로봇 위치 추가
occupied.add(newX + "," + newY);
}
}
return "OK";
}
}
728x90
'백준' 카테고리의 다른 글
[BOJ] BOJ 9252번 'LCS 2' (Java) (+ LCS 개념) (0) | 2025.01.08 |
---|---|
[BOJ] BOJ_2178 미로 탐색 (JAVA) (0) | 2024.12.02 |
[BOJ] BOJ_1753 최단경로 (JAVA) (0) | 2024.07.29 |
[BOJ] BOJ_10800 컬러 (JAVA) (0) | 2024.07.21 |
[BOJ] BOJ_31945 정육면체의 네 꼭짓점 (JAVA) (0) | 2024.07.19 |