일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- LOLIN D32
- 페이지교체알고리즘
- 9996
- 백준
- WebRTC란
- RBT
- 3XN 타일링
- dp
- REACT
- 1796
- c++
- 2623
- stl
- 백준 2133
- TDD란?
- 메모리계층
- 데이터 링크 계층
- Vite 사용 이유
- tfjs
- 구현
- TDD
- 구슬탈출
- 풀이
- ESP32
- mediastream
- 13459
- 자료구조
- 적두트리
- 테스트주도개발
- OpenVidu
- Today
- Total
그냥 블로그
[ 백준/C++ ] 2174 로봇 시뮬레이션 본문
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;
}
'C++ > 백준' 카테고리의 다른 글
[C++/백준] 14891 톱니바퀴 (0) | 2023.11.19 |
---|---|
[C++/백준] 마법사 상어와 비바라기 (1) | 2023.11.12 |
[ 백준 / C++ ] 1181 단어 정렬 + sort() (1) | 2023.10.21 |
[ 백준/C++ ] 2468 안전 영역 (0) | 2023.10.12 |
[ 백준/C++ ] 나는야 포켓몬 마스터 이다솜 (1) | 2023.10.10 |