반응형
어째 좀 할만하다 싶더니, 실버3 문제였구나..
명령어의 MAXIMUM 길이는 50이고, 모두 F일 때가 가장 긴 길이일 테니
나올 수 있는 가장 긴 가로 x 세로 는 50 x 50 이다.
따라서, Arr[101][101] 을 선언한 뒤에 ( => Arr[0][0] ~ Arr[100][100] )
중앙인 Arr[50][50]부터 시작하게 되면, 절대 배열 밖을 벗어날 수 없다.
입력값을 그대로 이행하여 미로를 만들어 준 뒤에, 배열을 돌면서 min_x, min_y, max_x, max_y 를 계산해준다.
직사각형을 만들기 위해 최대 범위를 지정해 주는 것이다.
만들고 난 뒤에는 min_x, min_y, max_x, max_y 를 이용해서 반복문을 돌면서,
기존에 Arr[][] 안의 값이 '.' 인 경우 그대로 출력해주고, 아닐 경우 '#'을 출력해주면 된다.
// 말하는 대로 이동해서 만들어 본 다음에, 가장 먼저 시작된 쪽과 늦게 끝나는 점을 찾는다.
#include <iostream>
using namespace std;
char Arr[101][101]; // 명령이 아무리 길어봤자 50이므로, Arr[50][50] 을 중앙으로 잡고 시작한다.
int x, y; // 내 현재 위치.
int direction = 0; // 처음엔 남쪽.
// 처음 시작은 남쪽. 남 서 북 동 가자.
int mx[4] = {1, 0, -1, 0};
int my[4] = {0, -1, 0, 1};
int main() {
int N;
string cmd;
cin >> N;
cin >> cmd;
// 중앙에서 시작하며, 시작 위치는 기본적으로 찍어줌.
x = y = 50;
Arr[x][y] = '.';
// make Map
for(int i = 0; i < N; i++) {
switch(cmd[i]) {
case 'F':
x += mx[direction];
y += my[direction];
Arr[x][y] = '.';
break;
case 'L':
direction = (direction + 3) % 4;
break;
case 'R':
direction = (direction + 1) % 4;
break;
}
}
int min_x = 101, min_y = 101, max_x = -1, max_y = -1;
for(int i = 0; i < 101; i++) {
for(int j = 0; j < 101; j++) {
if(Arr[i][j] == '.') {
if(min_x > i)
min_x = i;
if(max_x < i)
max_x = i;
if(min_y > j)
min_y = j;
if(max_y < j)
max_y = j;
}
}
}
for(int i = min_x; i <= max_x; i++) {
for(int j = min_y; j <= max_y; j++) {
if(Arr[i][j] !='.')
cout << '#';
else
cout << '.';
}
cout << "\n";
}
}
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 14501번 퇴사 (0) | 2022.06.28 |
---|---|
[BaekJoon/백준] 1941번 소문난 칠공주 (0) | 2022.06.28 |
[BaekJoon/백준] 2251번 물통 (0) | 2022.06.26 |
[BaekJoon/백준] 14891번 톱니바퀴 (0) | 2022.06.26 |
[BaekJoon/백준] 2108번 통계학 (0) | 2022.06.25 |