https://www.acmicpc.net/problem/1347
C
#include <stdio.h>
int main()
{
int n, minx=51, maxx=51, miny=51, maxy=51, x=51, y=51, way=0;
char str[103][103], input[50];
scanf("%d", &n);
scanf("%s", &input);
for (int i = 0; i < 103; i++) for (int j = 0; j < 103; j++) str[i][j] = '#';
str[x][y] = '.';
for (int i = 0; i<n; i++)
{
if (input[i] == 'F')
{
if (way == 0) x++;
else if (way == 1) y--;
else if (way == 2) x--;
else y++;
str[x][y] = '.';
}
else if (input[i] == 'L')
{
if (way > 0) way--;
else way = 3;
}
else
{
if (way < 3) way++;
else way = 0;
}
if (x > maxx) maxx = x;
if (x < minx) minx = x;
if (y > maxy) maxy = y;
if (y < miny) miny = y;
}
for (int i = minx; i <= maxx; i++)
{
for (int j = miny; j <= maxy; j++) printf("%c", str[i][j]);
printf("\n");
}
return 0;
}
C++
#include <iostream>
using namespace std;
int main()
{
int n, minx = 51, maxx = 51, miny = 51, maxy = 51, x = 51, y = 51, way = 0;
char str[103][103], input[50];
cin >> n;
cin >> input;
for (int i = 0; i < 103; i++) for (int j = 0; j < 103; j++) str[i][j] = '#';
str[x][y] = '.';
for (int i = 0; i < n; i++)
{
if (input[i] == 'F')
{
if (way == 0) x++;
else if (way == 1) y--;
else if (way == 2) x--;
else y++;
str[x][y] = '.';
}
else if (input[i] == 'L')
{
if (way > 0) way--;
else way = 3;
}
else
{
if (way < 3) way++;
else way = 0;
}
if (x > maxx) maxx = x;
if (x < minx) minx = x;
if (y > maxy) maxy = y;
if (y < miny) miny = y;
}
for (int i = minx; i <= maxx; i++)
{
for (int j = miny; j <= maxy; j++) cout << str[i][j];
cout << "\n";
}
return 0;
}
코드 설명
배열을 넉넉하게 설정하고, 2차원 배열의 한가운데에서 시작해서 적은 내용대로 이동한다. 이동할 때마다 현재 위치 str[x][y]를 1로 설정한다. x좌표의 최대, 최소, y좌표의 최대,최소를 구해서 배열에서 출력할 부분의 좌표들을 구한다. 이후 중첩반복문을 돌면서 str[i][j]를 출력한다. 한 줄을 출력하면 줄바꿈을 해주면서 미로 지도를 출력하고 프로그램을 종료한다.
지도를 크게 만들고 유의미한 부분만 출력하는 방법을 사용했다. 적은 내용의 길이 n과 적은 내용 input을 입력받는다. 이후 홍준이가 한쪽 방향으로만 계속 이동할 경우를 고려해서 2차원 배열인 str를 넉넉하게 선언하고, 모든 값을 '#'으로 만든다.
현재 위치를 str[51][51]로 정하고, str[51][51]에 .을 저장한다.
반복문을 통해 입력받은 내용을 하나씩 확인한다. 이때 way 변수를 활용하는데, 홍준이가 보는 방향을 뜻한다. (남쪽을 0, 서쪽을 1, 북쪽을 2, 동쪽을 3으로 표시한다.) 'F'은 한 칸 앞으로 이동이므로 if문을 통해 방향에 맞게 이동한다. 이후 이동한 위치도 .으로 표시한다. 'L'의 경우에는 방향을 1씩 감소시키거나, 0의 경우에는 3으로 값을 바꾼다. 'R'의 경우, 방향이 3의 경우에는 0으로, 그렇지 않을 경우에는 1씩 증가시킨다. 이후 x의 최대, 최소와 y의 최대 최소가 변할 경우 이를 변경한다.
반복문이 끝난 뒤에는 미로 지도를 출력한다. 이때 x의 최소~최대에 해당하는 줄에서, y의 최소~최대에 해당하는 칸을 출력하면 된다. 한 줄이 끝날 때마다 줄바꿈을 해주면서 값을 출력한 후에 프로그램을 종료한다.
느낀 점
처음엔 아이디어를 찾지 못해 고민이 많았지만, 방법을 찾은 뒤로는 빠르게 풀었던 문제다! 1차적으로 코드를 작성한 뒤에 각각의 경우마다의 str 배열 전체를 출력해서 내가 코드를 잘 작성했는지 확인했다.
'PS (C, C++)' 카테고리의 다른 글
[백준/C & C++] 1966 프린터 큐 (2) | 2023.02.02 |
---|---|
[백준/C & C++] 1439 뒤집기 (0) | 2023.02.01 |
[백준/C & C++] 3273 두 수의 합 (0) | 2023.01.30 |
[백준/C & C++] 2740 행렬 곱셈 (0) | 2023.01.29 |
[백준/C & C++] 1124 언더프라임 (0) | 2023.01.28 |