그냥 블로그

[ 백준/C++ ] 2174 로봇 시뮬레이션 본문

C++/백준

[ 백준/C++ ] 2174 로봇 시뮬레이션

코딩하는 공대생 2023. 10. 29. 17:48
반응형
 

2174번: 로봇 시뮬레이션

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

www.acmicpc.net

 

[문제 설명]

가로 A, 세로 B인 땅에 로봇들이 N개 위치해 있다.

로봇들의 초기위치는 x좌표, y좌표로 나타나고 x좌표는 오니쪽부터, y좌표는 아래쪽부터 순서가 매겨진다.

이 명령들에 M개의 명령을 내리려한다. 각각의 명령은 순차적으로 실행된다. 

 

1. L : 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전

2. R: 로봇이 향하고 있는 방향 기준 오른쪽 90도

3. F : 로봇이 향하고 있는 방향 기준 앞으로 한 칸. 

 

로봇과 로봇이 부딪힐 경우  : Robot X crashes into the wall

로봇이 벽에 부딪힐 경우(맵을 벗어날 경우) : Robot X crashes into robot Y

를 출력하는 문제이다.

 

[과정]

일단, 보자마자 케이스를 나눠서 푸는 구현 문제임을 깨달았다.

방향 구별에 있어선 항상 쓰던 dy, dx 배열을 사용하면 되겠구나하고 생각을 했고, 문제에 나와있는 대로 왼쪽 90도 오른쪽 90도를 구별해서

int dy[] = { 1,0,-1,0 };
int dx[] = { 0,1,0,-1 };

로 나타냈다.

 

두번째로 어떻게 로봇들의 방향을 저장하기 위해 map을 사용했다.

벡터는 맨 뒤에 원소 추가, 인덱스로 접근하는 시간 복잡도가 O(1)이기 때문에 사용했다. 

 

그리고 맵에 로봇들을 위치시켜주고 방향 정보도 벡터에 저장한 후 들어오는 명령대로 실행하면 된다.

 

시간 단축을 위해

위치 또한 방향정보처럼 저장해주는 방법을 선택했다. >> vector

=> 인덱스로 접근하기 위해 로봇번호 -1 로 찾아줘야함.

 

왜 map이랑 vector로 다르게 사용했는지 잘 기억이 안나는데 그냥 통일해도 될 거 같다. => map의 추가가 O(log(N))이라는 걸로 봐선, vector로 통일하는 편이 빠를 듯. 왜 그랬지?

 

암튼 그렇게 진행하면 되는데 여기서 주의할 점이! 

1. 입력 받을때 y,x 순서가 아니라 x,y 순서로 입력됨

2. 위의 그림을 보면 알 듯이 좌측 상단부터 0~N이 아니라 N~1으로 진행되기 때문에 그 점을 고려해줘야 함. >> 여길 생각 안해서 많이 헤맴 ㅠ

 

2차원 배열 인덱스로 진행을 해주면, 좌 우 방향은 동일하지만 위 아래를 변환 해줘야 한다. 결국 N이 (+1,0) S가(-1,0)인 셈

 

좀 사소한걸 놓치는 문제가 많았음.. 

 

 

#include<bits/stdc++.h>

using namespace std;

int dy[] = { 1,0,-1,0 };
int dx[] = { 0,1,0,-1 };

map<int, int> dir;
vector <pair<int, int>> pos;
vector<string> ans;

int land[100][100];

int main() {
	fill(&land[0][0],&land[0][0]+100*100,0);
	int A, B;
	int N, M;
	cin >> A >> B;
	cin >> N >> M;

	for (int i = 1; i <= N; i++) {
		int y, x, n;
		char w;
		cin >> x >> y >> w;
		land[y][x] = i;
		pos.push_back({ y,x });
		n = 3;
		if (w == 'N') n = 0;
		else if (w == 'E') n = 1;
		else if (w == 'S') n = 2;
		dir[i] = n;
	}
	for (int i = 0; i < M; i++) {
		int num, how, y, x, ny, nx;
		char comm;
		cin >> num >> comm >> how;

		tie(y, x) = pos[num-1];
		land[y][x] = 0;
		
		for (int j = 0; j < how; j++) {
			if (comm == 'F') {
				ny = y+dy[dir[num]];
				nx = x+dx[dir[num]];
				if (ny < 1 || nx < 1 || ny > B || nx > A) {
					cout<< "Robot " + to_string(num) + " crashes into the wall";
					return 0;
				}
				if (land[ny][nx] != 0) {
					cout<< "Robot " +to_string(num)+ " crashes into robot "+ to_string(land[ny][nx]);
					return 0;
				}
				y = ny;
				x = nx;
			}
			else if (comm == 'R') {
				dir[num] = (dir[num]+1) % 4;
			}
			else {
				dir[num] = dir[num ]>0?dir[num]-1:3;
			}
		}
		land[y][x] = num;
		pos[num - 1] = { y,x };
	}
	cout << "OK";
	return 0;

}