본문 바로가기
[백준]

[BaekJoon/백준] 1347번 미로 만들기

by Hevton 2022. 6. 27.
반응형

 

어째 좀 할만하다 싶더니, 실버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";
    }
}

 

반응형