https://www.acmicpc.net/problem/1347
문제
홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.
입력으로 홍준이가 적은 내용을 나타내는 문자열이 주어진다. 각 문자 하나는 한 번의 움직임을 말한다. ‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다. 즉, 90도를 회전하면서, 위치는 그대로인 것이다.
입력
첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 홍준이가 적은 내용이 내용이 주어진다.
출력
첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.
문제 풀이
구현 문제.
100 칸 이상의 행과 열을 가진 2차원 미로 배열을 선언한다. 홍준이가 바라보고 있는 방향을 저장하는 변수를 선언하여 문자열에서 L이나 R이 나오면 왼쪽 또는 오른쪽으로 바라보도록 구현한다. 문자가 F라면 바라보는 방향으로 한 칸 이동하여 .로 해당 칸을 채운다.
배열 전체는 홍준이가 방문하여 .로 채워진 칸, 초기화 값이 들어있는 칸으로 나뉜다. 배열을 탐색하여 미로의 크기를 뽑아낸다. .가 저장된 칸 중 i 값이 가장 작은 값이 미로의 가장 작은 행, i 값이 가장 큰 값이 미로의 가장 큰 행, j값이 가장 작은 값이 미로의 가장 작은 열, j 값이 가장 큰 값이 미로의 가장 큰 열이다.
미로의 행과 열을 탐색하여 초기화되지 않은 칸은 벽이므로 #를 출력하고, 아니라면 .를 출력한다.
아래는 코드.
#include <iostream>
using namespace std;
char** maze = new char* [120];
int currentPosX = 60;
int currentPosY = 60;
void moveTo(int directionPos)
{
if (directionPos == 0)
{
currentPosX++;
}
else if (directionPos == 1)
{
currentPosY++;
}
else if (directionPos == 2)
{
currentPosX--;
}
else
{
currentPosY--;
}
maze[currentPosX][currentPosY] = '.';
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int N;
string str;
string directions[] = { "south", "east", "north", "west" };
int row1 = 60;
int row2 = 60;
int col1 = 60;
int col2 = 60;
int directionPos = 0;
cin >> N;
for (int i = 0; i < 120; i++)
{
maze[i] = new char[120];
for (int j = 0; j < 120; j++)
{
maze[i][j] = '!';
}
}
if (N != 0)
{
cin >> str;
maze[currentPosX][currentPosY] = '.';
for (int i = 0; i < str.length(); i++)
{
if (str[i] == 'L')
{
directionPos++;
if (directionPos == 4)
{
directionPos = 0;
}
}
else if (str[i] == 'R')
{
directionPos--;
if (directionPos == -1)
{
directionPos = 3;
}
}
else
{
moveTo(directionPos);
}
}
for (int i = 0; i < 120; i++)
{
for (int j = 0; j < 120; j++)
{
if (maze[i][j] == '.')
{
row1 = min(row1, i);
row2 = max(row2, i);
col1 = min(col1, j);
col2 = max(col2, j);
}
}
}
for (int i = row1; i <= row2; i++)
{
for (int j = col1; j <= col2; j++)
{
if (maze[i][j] == '!')
{
cout << "#";
}
else
{
cout << maze[i][j];
}
}
cout << "\n";
}
}
else
{
cout << "." << "\n";
}
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2577] 숫자의 개수 (C++) (0) | 2024.07.25 |
---|---|
[백준 2747] 피보나치 수 (C++) (0) | 2024.07.24 |
[백준 17845] 수강 과목 (C++) (0) | 2024.07.22 |
[백준 29717] 슬라임 잡고 레벨 업! (C++) (0) | 2024.07.21 |
[백준 11048] 이동하기 (C++) (0) | 2024.07.20 |