본문 바로가기
알고리즘 문제풀이/백준

[백준 2174] 로봇 시뮬레이션(JAVA)

by 소보루:-) 2020. 3. 4.

https://www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

문제 가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다. 로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다. 이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로

www.acmicpc.net

 

위 그림과 같이 맵이 일반적인 다른 문제들과 다르게, 행번호가 밑에서 부터 1로 시작한다.

그래서 맵을 상하반전 시켜서 생각해봤다.

이에 따른 방향설정에 대해서 주의해야 해야하는데, 이를 간과해서 3번정도 틀린 것 같다.ㅠㅠ

설계를 꼼꼼히 하자!!!!

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Robot{
	int x;
	int y;
	int dir;
	public Robot(int x, int y, int dir) {
		super();
		this.x = x;
		this.y = y;
		this.dir = dir;
	}
	
}
public class Main_bj_2174_로봇시뮬레이션 {

	public static int R,C;
	public static int N,M;
	public static int[][] map;
	public static Robot[] rb;
	public static int[] dx= {-1,0,0,1};
	public static int[] dy= {0,-1,1,0};
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(br.readLine()," ");
		C=Integer.parseInt(st.nextToken());
		R=Integer.parseInt(st.nextToken());
		st=new StringTokenizer(br.readLine()," ");
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		rb=new Robot[N+1];//인덱스 1부터
		map=new int[R+1][C+1];
		for(int i=1; i<=N; i++) {
			st=new StringTokenizer(br.readLine()," ");
			int y=Integer.parseInt(st.nextToken());
			int x=Integer.parseInt(st.nextToken());
			int d=0;
			char c=st.nextToken().charAt(0);
			if(c=='N') d=3;//맵을 상하반전 시켜서 N과 S을 바꿔줘야함
			else if(c=='W') d=1;
			else if(c=='E') d=2;
			rb[i]=new Robot(x,y,d);
			map[x][y]=1;
		}
		//명령 실행
		for(int i=1; i<=M; i++) {
			st=new StringTokenizer(br.readLine()," ");
			int index=Integer.parseInt(st.nextToken());
			char order=st.nextToken().charAt(0);
			int cnt=Integer.parseInt(st.nextToken());
			if(order!='F') cnt%=4;
			for(int c=0; c<cnt; c++) {
				if(order=='R') {//맵을 상하반전 시켜서 R과 L을 바꿔줘야함
					if(rb[index].dir==0) rb[index].dir=1;
					else if(rb[index].dir==1) rb[index].dir=3;
					else if(rb[index].dir==2) rb[index].dir=0;
					else if(rb[index].dir==3) rb[index].dir=2;
				}else if(order=='L') {
					if(rb[index].dir==0) rb[index].dir=2;
					else if(rb[index].dir==1) rb[index].dir=0;
					else if(rb[index].dir==2) rb[index].dir=3;
					else if(rb[index].dir==3) rb[index].dir=1;
				}else if(order=='F') {
					int x = rb[index].x;
					int y = rb[index].y;
					int dir = rb[index].dir;
					int nx = x + dx[dir];
					int ny = y + dy[dir];
					if(nx<1||ny<1||nx>R||ny>C) {
						System.out.println("Robot "+index+" crashes into the wall");
						System.exit(0);
					}
					if(map[nx][ny]==1) {
						int Y=0;
						for(int z=1; z<=N; z++) {
							if(rb[z].x==nx && rb[z].y==ny)
								Y=z;
						}
						System.out.println("Robot "+index+" crashes into robot "+Y);
						System.exit(0);
					}
					map[x][y]=0;
					map[nx][ny]=1;
					rb[index].x=nx;
					rb[index].y=ny;
				}
			}
		}
		System.out.println("OK");
	}

}

댓글