문제
홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다.
모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다.
그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.
입력으로 홍준이가 적은 내용을 나타내는 문자열이 주어진다. 각 문자 하나는 한 번의 움직임을 말한다.
‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다.
즉, 90도를 회전하면서, 위치는 그대로인 것이다.
입력
첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 홍준이가 적은 내용이 내용이 주어진다.
출력
첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.
해결 방법
홍준이의 위치가 주어지지 않는다
는게 이 문제의 포인트다.
그럼 어떻게 해야 되는가? 홍준이가 이동할 수 있는 최대 범위를 고려하여 맵을 엄청 크게 만들고 홍준이는 정중앙
에 있다고 생각하면 된다.
홍준이는 오른쪽, 왼쪽, 위, 아래 각각 최대 50
만큼 움직일 수 있기 때문에 이걸 커버할 수 있는 맵을 만들어주면 된다.
나는 110 X 110 으로 만들었다. 그럼 홍준이는 (55, 55)
위치에 있는 것!
북동남서 방향을 각각 0, 1, 2, 3으로 설정하고 홍준이는 처음에 남쪽을 바라보고 있으므로 초기 방향을 2
로 설정해줬다.
그리고 문자열을 따라 왼쪽, 오른쪽 회전을 하고 F
를 만나면 해당 칸으로 이동한뒤 '.'를 저장해주면 된다.
이때 홍준이가 이동한 왼쪽 끝
, 오른쪽 끝
, 위쪽 끝
, 아래쪽 끝
을 각각 저장해줘야 되는데
이는 마지막에 맵을 출력할 때 꼭 필요하다!
내 코드
// [1347] 미로 만들기
// 구현, 시뮬레이션
#include <iostream>
#include <algorithm>
using namespace std;
string str;
char map[110][110];
int leftEnd = 55, rightEnd = 55, bottomEnd = 55, topEnd = 55;
void init()
{
for (int i = 0; i < 110; i++) {
for (int j = 0; j < 110; j++) {
map[i][j] = '#';
}
}
}
void solution()
{
int x = 55, y = 55, dir = 2;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
map[x][y] = '.';
for (int i = 0; i < str.size(); i++) {
if (str[i] == 'R') {
dir++;
if (dir > 3) dir = 0;
}
else if (str[i] == 'L') {
dir--;
if (dir < 0) dir = 3;
}
else {
x += dx[dir]; y += dy[dir];
map[x][y] = '.';
}
leftEnd = min(x, leftEnd);
rightEnd = max(x, rightEnd);
topEnd = min(y, topEnd);
bottomEnd = max(y, bottomEnd);
}
}
void output()
{
for (int i = leftEnd; i <= rightEnd; i++) {
for (int j = topEnd; j <= bottomEnd; j++) {
cout << map[i][j];
}
cout << "\n";
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
cin >> str;
init();
solution();
output();
return 0;
}
'Baekjoon > 시뮬레이션' 카테고리의 다른 글
[13335] 트럭(C++) (0) | 2022.07.01 |
---|---|
[1713] 후보 추천하기(C++) (0) | 2022.07.01 |
[1244] 스위치 켜고 끄기(C++) (0) | 2022.06.30 |
[1966] 프린터 큐 (0) | 2022.06.24 |
[13567] 로봇(C++) (0) | 2020.06.21 |