알고리즘/PS - 백준

[백준 2174 - Java] 로봇 시뮬레이션

excited-hyun 2021. 10. 7. 15:28
반응형

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

 

2174번: 로봇 시뮬레이션

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순

www.acmicpc.net

 

문제

가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다.

로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.

이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.

  1. L: 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.
  2. R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.
  3. F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.

간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.

잘못된 명령에는 다음의 두 가지가 있을 수 있다.

  1. Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
  2. Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.

입력

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 회수로 나타낸다. 각 명령의 반복 회수는 1이상 100이하이다.

출력

첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.

 

풀이

 

저는 로봇까지 다 입력 받은 후엔 명령을 하나씩 입력 받아 처리해가면서 문제를 풀었습니다.

 

우선 로봇들을 저장하는 1차원 배열 arr과 땅에서 로봇들의 위치를 표시해 둘 1차원 배열 map을 사용합니다. map의 경우엔 로봇이 놓이는 자리에 해당 로봇의 idx를 저장하고 빈 땅인 경우엔 0이 있게 합니다.

 

회전의 경우엔 4의 배수번 반복하는 경우 회전하기 전과 동일하기 때문에 반복횟수 %4번 회전하도록 하였습니다. 또한 이 경우는 이동이 없기 때문에 충돌여부를 확인하지 않아도 됩니다.

 

이동의 경우엔 반복횟수만큼 현재 로봇이 향한 방향으로 이동시키면서 매번 충돌을 확인해줍니다. 충돌이 일어난 경우 벽과의 충돌인지, 다른 로봇과의 충돌인지 출력하고 실행을 종료합니다.

 

모든 명령을 완료할 때까지 충돌이 일어나지 않은 경우엔 OK를 출력하고 종료합니다.

 

import java.util.Scanner;

public class Main {
	static int A, B;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		A = sc.nextInt();
		B = sc.nextInt();
		
		int N, M;
		N = sc.nextInt();
		M = sc.nextInt();
		
		int[][] map = new int[B+1][A+1];
		
		Robot[] arr = new Robot[N];
		
		for(int i=0; i<N; i++) {
			int c = sc.nextInt();
			int r = sc.nextInt();
			String dir = sc.next();
			
			arr[i] = new Robot(r, c, dir.charAt(0));
			map[r][c] = i+1;
			
		}
		
		for(int i=0; i<M; i++) {
			int idx = sc.nextInt();
			String com = sc.next();
			int re = sc.nextInt();
			
			//앞으로 이동 
			if(com.charAt(0) == 'F') {
				int nowR = arr[idx-1].r;
				int nowC = arr[idx-1].c;
				char nowDir = arr[idx-1].dir;
				map[nowR][nowC] = 0;
				
				for(int j=0; j<re; j++) {
					//System.out.println(nowR+" "+nowC);
					if(nowDir == 'N') {
						nowR++;
					}
					else if(nowDir == 'W') {
						nowC--;
					}
					else if(nowDir == 'E') {
						nowC++;
					}
					else if(nowDir == 'S') {
						nowR--;
					}
					
					//벽에 충돌!
					if(nowR<=0 || nowR>B || nowC<=0 || nowC>A) {
						System.out.println("Robot "+idx+" crashes into the wall");
						return ;
					}
					//다른 로봇과 충돌!
					else if(map[nowR][nowC] != 0) {
						System.out.println("Robot "+idx+" crashes into robot "+map[nowR][nowC]);
						return ;
					}
					
					
				}
				map[nowR][nowC] = idx;
				arr[idx-1].r = nowR;
				arr[idx-1].c = nowC;
			}
			
			//왼쪽 회전 
			else if(com.charAt(0) == 'L') {
				int change = re%4;
				for(int j=0; j<re; j++) {
					char nowDir = arr[idx-1].dir;
					if(nowDir == 'N') {
						arr[idx-1].dir = 'W';
					}
					else if(nowDir == 'W') {
						arr[idx-1].dir = 'S';
					}
					else if(nowDir == 'E') {
						arr[idx-1].dir = 'N';
					}
					else if(nowDir == 'S') {
						arr[idx-1].dir = 'E';
					}
				}
			}
			//오른쪽 회전 
			else if(com.charAt(0) == 'R') {
				int change = re%4;
				for(int j=0; j<change; j++) {
					char nowDir = arr[idx-1].dir;
					if(nowDir == 'N') {
						arr[idx-1].dir = 'E';
					}
					else if(nowDir == 'W') {
						arr[idx-1].dir = 'N';
					}
					else if(nowDir == 'E') {
						arr[idx-1].dir = 'S';
					}
					else if(nowDir == 'S') {
						arr[idx-1].dir = 'W';
					}
				}
			}
		}
		
		System.out.println("OK");

	}
}

class Robot{
	int r, c;
	char dir;
	
	Robot(int r, int c, char dir){
		this.r = r;
		this.c = c;
		this.dir = dir;
		
	}
}
728x90
반응형