반응형
출처: https://www.acmicpc.net/problem/1347
Input
5
RRFRF
Output
..
.#
문제에서 N이 0보다 크고 50보다 작다고 했으므로 상하좌우 어떤 방향이든 한 방향으로만 가는 경우를 고려해서
미로의 크기를 101 × 101 설정
따라서 시작점을 배열의 가운데 지점 (50, 50)으로 설정
이 문제에서는 map[101][101] 크기에서 실제 미로의 크기를 추출해야 합니다.
직사각형 미로에서 기준점격인 시작점과 끝점을 알아야 합니다.
시작점과 끝점을 시작 위치(50,50)에서 이동할 때마다 비교해서
x, y의 최솟값(왼쪽 맨 위)이 시작점, x,y의 최댓값(오른쪽 맨 아래)이 끝점이 되도록 갱신해줍니다.
최종적으로는 직사각형 범위만큼을 출력합니다.
#include <iostream>
#include<string>
using namespace std;
int N, dir;
string str;
bool map[101][101];
// 남 서 북 동
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, -1, 0, 1};
void changeDirection(char cmd){
if(cmd == 'L') dir = (dir + 3) % 4;
else if(cmd == 'R') dir = (dir + 1) % 4;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> str;
dir = 0;
// 시작점을 가운데 칸으로 설정
int curX = 50, curY = 50;
map[curX][curY] = true;
// 직사각형의 왼쪽 위 좌표(sX,sY)와 오른쪽 아래 좌표(eX,eY)
int sX = curX, sY = curY, eX = curX, eY = curY;
for (int i = 0; i < N; i++){
// 왼쪽으로 회전
if (str[i] == 'L' || str[i] == 'R'){
changeDirection(str[i]);
continue;
}
// 앞으로 직진 (str[i] == 'F')
curX += dx[dir];
curY += dy[dir];
map[curX][curY] = true;
if (curX < sX) sX = curX;
if (curY < sY) sY = curY;
if (curX > eX) eX = curX;
if (curY > eY) eY = curY;
}
for (int i = sX; i <= eX; i++){
for (int j = sY; j <= eY; j++){
if(map[i][j]) cout << '.';
else cout << '#';
}
cout << '\n';
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 1173 운동 (0) | 2021.02.26 |
---|---|
[BOJ] 백준 2580 스도쿠 (0) | 2021.02.26 |
[BOJ] 백준 1986 체스 (0) | 2021.02.26 |
[BOJ] 백준 1331 나이트 투어 (0) | 2021.02.26 |
[BOJ] 백준 1107 리모컨 (0) | 2021.02.26 |
댓글