반응형
풀이
엄청난 도전을 한 문제...
풀이 과정은 어렵지 않지만 헷갈리면 엄청 헷갈린 문제
헷갈린 문제 포인트 1.
x축, y축이 일반적인 x,y값이 아닌 수학 문제 풀때 1사분면? 처럼 위치를 나타낸다
문제 수정하고 계속 틀려서 왤까 하다가 경계값을 반대로 안했었다...
헷갈린 문제 포인트 2.
백준에는 테스트 케이스가 하나만 주어져서
L, R일때 왼쪽 오른쪽으로 90도 방향으로만 도는 줄 알았다...
https://nordic.icpc.io/ncpc2005/ 문제 낸 사이트 들어갔더니
테케가 5개 정도 주어지고 L방향으로 96번 회전하는 테케도 있어서
이거때문에 엄청 오래걸렸따...
나머지 구현은 어렵지 않으므로 코드를 통해 확인하면 됩니다.
import java.io.*;
import java.util.*;
public class Main {
static int A,B,N,M;
static int[][] map;
static int[][] robots;
//북 동 남 서
static int[] dx = {-1,0,1,0};
static int[] dy = {0,1,0,-1};
static Queue<String> queue = new LinkedList<String>();
public static void main(String[] args) throws Exception{
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][A];
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
robots = new int[N][3];
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine());
int y = Integer.parseInt(st.nextToken())-1;
int x = B-Integer.parseInt(st.nextToken());
robots[i][0] = x;
robots[i][1] = y;
map[x][y] = i + 1;
String dir = st.nextToken();
// 북
if(dir.equals("N")) {
robots[i][2] = 0;
}
// 동
else if(dir.equals("E")) {
robots[i][2] = 1;
}
// 남
else if(dir.equals("S")) {
robots[i][2] = 2;
}
// 서
else if(dir.equals("W")) {
robots[i][2] = 3;
}
}
for(int i = 0 ; i < M ; i++) {
st = new StringTokenizer(br.readLine());
int robotIndex = Integer.parseInt(st.nextToken()) - 1;
String command = st.nextToken();
// 전진
int count = Integer.parseInt(st.nextToken());
if(command.equals("F")) {
commnadF(robotIndex, count);
}
// 방향전환
else {
// 왼쪽 90
count %= 4;
if(command.equals("L")) {
robots[robotIndex][2] = (robots[robotIndex][2] + (4-count)) % 4;
}
// 오른쪽 90
else if(command.equals("R")) {
robots[robotIndex][2] = (robots[robotIndex][2] + count) % 4;
}
}
}
if(queue.isEmpty()) System.out.println("OK");
else System.out.println(queue.poll());
}
private static void commnadF(int robotIndex, int count) {
int curX = robots[robotIndex][0];
int curY = robots[robotIndex][1];
int dir = robots[robotIndex][2];
for(int i = 0 ; i < count ; i++) {
int nx = curX + dx[dir];
int ny = curY + dy[dir];
if(0 > nx || nx >= B || 0 > ny || ny >= A) {
queue.offer("Robot "+ (robotIndex+1) + " crashes into the wall");
break;
}
else if(map[nx][ny] != 0) {
queue.offer("Robot "+ (robotIndex+1) +" crashes into robot " + map[nx][ny]);
break;
}
map[curX][curY] = 0;
map[nx][ny] = robotIndex + 1;
curX = nx;
curY = ny;
robots[robotIndex][0] = nx;
robots[robotIndex][1] = ny;
}
}
}
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 백준 19237] 어른 상어 (0) | 2022.02.04 |
---|---|
[Java/자바 백준 2234] 성곽 (0) | 2022.02.03 |
[Java/자바 백준 13901] 로봇 (0) | 2022.01.28 |
[Java/자바 백준 11559] PuyoPuyo (0) | 2022.01.18 |
[Java/자바 백준 1062] 가르침 (0) | 2022.01.18 |