본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1347 미로 만들기

by 까망 하르방 2021. 2. 26.
반응형

출처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

댓글