https://www.acmicpc.net/problem/2174
로봇의 초기 위치 : x, y
x좌표는 왼쪽부터, y좌표는 아래쪽부터
-> y 좌표가 일반적인 방향과 반대임
-> x y과 프로그래밍적 상식과 반대임
로봇은 방향을 가짐
로봇의 개수는 여러 개
로봇에 M개의 명령을 내림
로봇에게 내릴 수 있는 명령
L : 왼쪽으로 90도 회전
R : 오른쪽으로 90도 회전
F : 향하고 있는 방향으로 한 칸 이동
- 입력
첫 번째 줄 : A B
A : 가로 길이
B : 세로 길이
두 번째 줄 : N M
N : 로봇의 개수
M : 로봇에 내릴 명령
N개 줄 : x y r
x : 가로 위치
y : 세로 위치
r : 로봇의 초기 회전
M개 줄 : robot order repeat
robot : 움직일 로봇
order : 명령
repeat : 반복 횟수
- 출력
문제가 없으면 OK 출력
문제가 발생하면 가장 먼저 발생하는 문제를 출력 후 종료
Robot X crashes into the wall
X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
Robot X crashes into robot Y
X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.
일반적인 구현(시뮬레이션) 문제입니다.
처음 문제를 접하면 꽤나 심플해서 할만해 보이는데,
배열을 사용한다면 세로 가로 순서가 반대로 입력되고, 특히 세로의 경우 아래에서 위로 증가하기 때문에 헷갈리지 않도록 하는 것이 중요합니다.
import java.io.*;
import java.util.*;
public class Main {
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// 첫 번째 줄
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken()); // 가로 길이
int B = Integer.parseInt(st.nextToken()); // 세로 길이
int[][] map = new int[B + 1][A + 1];
// 두 번째 줄
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 로봇의 개수
int M = Integer.parseInt(st.nextToken()); // 로봇에게 내릴 명령
int[] r = new int[N + 1];
int[] c = new int[N + 1];
int[] rot = new int[N + 1];
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
String fr = st.nextToken();
y = B - y + 1;
map[y][x] = i;
r[i] = y;
c[i] = x;
if (fr.equals("N")) {
rot[i] = 0;
} else if (fr.equals("E")) {
rot[i] = 1;
} else if (fr.equals("S")) {
rot[i] = 2;
} else if (fr.equals("W")) {
rot[i] = 3;
}
}
// print(map);
// 명령만큼 반복
L:for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
int robot = Integer.parseInt(st.nextToken());
String order = st.nextToken();
int repeat = Integer.parseInt(st.nextToken());
int ori_r = r[robot];
int ori_c = c[robot];
for (int d = 1; d <= repeat; d++) {
if (order.equals("L")) {
rot[robot] -= 1;
if (rot[robot] == -1) {
rot[robot] = 3;
}
}
else if (order.equals("R")) {
rot[robot] += 1;
if (rot[robot] == 4) {
rot[robot] = 0;
}
}
else if (order.equals("F")) {
int nr = r[robot] + dr[rot[robot]];
int nc = c[robot] + dc[rot[robot]];
if (nr > 0 && nr < map.length && nc > 0 && nc < map[0].length) {
if (map[nr][nc] == 0) {
r[robot] = nr;
c[robot] = nc;
continue;
} else {
System.out.println("Robot " + robot + " crashes into robot " + map[nr][nc]);
return;
}
} else {
System.out.println("Robot " + robot + " crashes into the wall");
return;
}
}
}
map[ori_r][ori_c] = 0;
map[r[robot]][c[robot]] = robot;
}
System.out.println("OK");
}
static void print(int[][] map) {
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[0].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
너무 오랜만에 코드를 풀어서 그런지 뒤집고 아래에서 위로 올라오는 순서 등을 고려하다가 시간을 다소 할애하였다.
한 번도 Fail 하지 않고 문제는 풀었으나 주기적으로 문제를 풀면서 감을 놓치지 않는 것이 중요할 것 같다.
해당 코드는 에디터가 코드 연습을 위해 직접 작성하였습니다.
혹시 오류가 있거나 더 좋은 코드 방향성을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!
python source : https://github.com/ssh5212/conding-test-practice
java source : https://github.com/ssh5212/coding-test-java
[Baekjoon] 백준 2638 치즈 (G3 / BFS) - Java (1) | 2023.08.31 |
---|---|
[Baekjoon] 백준 17406 배열 돌리기 4 (G4 / 구현) - Java (1) | 2023.08.29 |
[Programmers] 68644 두 개 뽑아서 더하기 (L1 / Set) - Java (1) | 2023.07.11 |
[Programmers] 1844 게임 맵 최단거리 (L2 / BFS) - Java (1) | 2023.04.16 |
[Baekjoon] 백준 14502 연구소 (G4 / DFS, BFS) - Java (1) | 2023.04.15 |