가장 기본적인 시뮬레이션.. 골드 5여서 쉽게 문제 읽다가는 틀렸습니다! 뜨는 그런 문제..
문제는 간단하다 각자의 위치에서 명령대로 수행하다 벽을 만나거나 다른 로봇과 부딪히면 종료하는 문제!
이문제에서 주의해야 할 점은 !! 맵과 방향!!
이렇게 뒤집어서 보게되면 N이 동쪽을 가리키게 되고 일반적으로 생각했던 방향과 다르게 된다는 점!!
기존에는 dir [][] = {{ -1 , 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }; 이렇게 동 서 남 북이었다면
dir [][] = {{ 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 이렇게 구성을 하는 것이다.
물론 첫 번째처럼 하려면 N이 방향 1이라고 줘도 되긴 한다!
나머지는 간단하다.
로봇의 위치와 방향을 받기 위한 클래스와
명령어를 받기위한 클래스를 따로 선언해서 복잡하지 않게 해 주었다.
여기서 고려했던 점은 count 총 명령어 수행 횟수가 4의 배수 단위로 수행된 것이 같기 때문에 나머지 한 수로만 계산하면 된다.
분홍색 네모는 현재 지점을 로봇이 없게 만들어준 후 수행이 완료되면 그지점에 로봇을 위치하게 되는 것이다.
파란색 네모 부분은 벽에 부딪히는 경우와 로봇에 부딛히는 경우를 구별해주기 위해 따로 표시했다.
여기서 꿀팁은 주자면 break fi를 하게 되면 이후의 명령어를 수행할 필요 없기 때문에 명령어 반복문 앞에 fi : 표시를 해주면 이 반복문을 나가게 된다!
기존에 wha와 whatsol을 -1로 초기화시켜줬기 때문에 벽에 부딪히지 않았다면 wha값 -1 whatsol 값 -1 유지
벽에 부딪혔다면 wha 값 변하고 whatsol 값 -1 유지
다른 로봇에 부딛혔다면 whatsol 값--> 부딪힌 로봇으로 바뀜
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static class robot {
int x;
int y;
int d;
public robot(int x, int y, int d) {
this.x = x;
this.y = y;
this.d = d;
}
}
public static class ab {
int who;
String what;
int count;
public ab(int who, String what, int count) {
this.who = who;
this.what = what;
this.count = count;
}
}
static int n, m, num, absol;
static int map[][], dir[][] = {{ 0, 1 }, { 1, 0 }, { 0, -1 },{ -1, 0 } };
static robot w[];
static ab com[];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
n=Integer.parseInt(st.nextToken());
m=Integer.parseInt(st.nextToken());
map=new int[n+1][m+1];
st=new StringTokenizer(br.readLine());
num=Integer.parseInt(st.nextToken());
absol=Integer.parseInt(st.nextToken());
w=new robot[num+1];
com=new ab[absol];
for(int i=1;i<=num;i++) {
st=new StringTokenizer(br.readLine());
int x=Integer.parseInt(st.nextToken());
int y=Integer.parseInt(st.nextToken());
String d=st.nextToken();
int di=0;
if(d.equals("N"))
{
di=0;
}
else if(d.equals("E"))
{
di=1;
}
else if(d.equals("S"))
{
di=2;
}else if(d.equals("W"))
{
di=3;
}
w[i]=new robot(x,y,di);
map[x][y]=i;
}
for(int i=0;i<absol;i++) {
st=new StringTokenizer(br.readLine());
com[i]=new ab(Integer.parseInt(st.nextToken()),st.nextToken(),Integer.parseInt(st.nextToken()));
}//입력 완료
int wha=-1;
int whatsol=-1;
fi:for(int i=0;i<absol;i++) {
int wh=com[i].who;
if(com[i].what.equals("L")) {
int k=com[i].count%4;
for(int j=0;j<k;j++) {
w[wh].d=(w[wh].d+3)%4;
}
}else if(com[i].what.equals("R")) {
int k=com[i].count%4;
for(int j=0;j<k;j++) {
w[wh].d=(w[wh].d+1)%4;
}
}else if(com[i].what.equals("F")) {
int k=com[i].count;
int x=w[wh].x;
int y=w[wh].y;
map[x][y]=0;
for(int j=0;j<k;j++) {
x+=dir[w[wh].d][0];
y+=dir[w[wh].d][1];
if(x<1||x>n||y<1||y>m) {
wha=wh;
break fi;
}
if(map[x][y]!=0) {
wha=wh;
whatsol=map[x][y];
break fi;
}
}
map[x][y]=wh;
w[wh].x=x;
w[wh].y=y;
}
}
if(wha==-1) {
System.out.println("OK");
}else if(whatsol==-1){
System.out.println("Robot "+wha+" crashes into the wall");
}else
System.out.println("Robot "+wha+" crashes into robot "+whatsol);
}
}
'알고리즘' 카테고리의 다른 글
백준 14466 <소가 길을 건너간 이유 6> (0) | 2020.09.16 |
---|---|
백준 6087 <레이저 통신> (0) | 2020.09.13 |
백준 11000 <강의실 배정> (0) | 2020.09.12 |
백준 17472 <다리 만들기 2 > (1) | 2020.09.04 |
정올 1681 <해밀턴 순환회로> (0) | 2020.09.03 |