본문 바로가기
프로그래밍/백준 복기

[구현] 백준 1347: 미로 만들기

by 개발도사(진) 2024. 1. 16.

1347번: 미로 만들기 (acmicpc.net)

 

1347번: 미로 만들기

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍

www.acmicpc.net

 

이 문제에서 찝찝한 점은 처음 시작할 때 미로가 몇 칸짜리인지 미리 알 수 없다는 점이다. 따라서 최악의 경우를 고려해서 미로의 최대 크기를 미리 구해 놓고, 그 중간에서부터 주어진 input에 따라 미로를 그려 나가는 작업을 하였다.

 

이 경우는 통상적인 정의의 "미로"라고는 할 수 없겠지만, input이 모두 'F'인 경우가 미로 크기가 가장 길어지는 경우일 것이다. input 길이는 50보다 작으므로, 나는 100*100의 미로를 가정하고 시작 지점을 [50,50]으로 가정하였다. 

int dir = 2;
vector<vector<int>> maze(100, vector<int>(100, 1));

int rValue = 50;
int cValue = 50;
int top = 50;
int bottom = 50;
int left = 50;
int right = 50;

maze[rValue][cValue] = 0;

 

미로의 모든 칸을 벽이라고 가정하고, input이 F가 들어오면 해당하는 칸을 0으로 뚫어 주는 방식으로 미로를 작성한 뒤, top, bottom, left, right 값을 업데이트해서 앞서 만든 100*100 예비 미로 중 어떤 부분만을 출력할지 정할 것이다.

 

for (int i = 0; i < inputVector.size(); i++)
    {
        switch (inputVector[i])
        {
        case 'R':
            dir = (dir + 3) % 4;
            break;
        case 'L':
            dir = (dir + 1) % 4;
            break;
        case 'F':
            switch (dir)
            {
            case 0:
                maze[--rValue][cValue] = 0;
                top = min(top, rValue);
                break;
            case 1:
                maze[rValue][--cValue] = 0;
                left = min(left, cValue);
                break;
            case 2:
                maze[++rValue][cValue] = 0;
                bottom = max(bottom, rValue);
                break;
            case 3:
                maze[rValue][++cValue] = 0;
                right = max(right, cValue);
                break;
            }
            break;
        }
    }

 

위 코드를 작성하면서 처음에는 습관대로 postfix를 사용했었다. 즉 maze[rValue++][cValue]=0 과 같은 식으로 작성했는데, 이렇게 하다 보니 맨 마지막 주어진 input이 반영이 안 되었다. maze[rValue][cValue]=0을 연산하고 r/cValue를 업데이트 하는 것이 아니라, 업데이트를 먼저 하고 maze의 해당하는 좌표값을 변경해야 하는 문제이기 때문이다.

 

postfix 연산자를 prefix 연산자로 바꾸자 문제가 해결되었다. 습관대로 작성하지 말고 목적에 알맞게 post, prefix를 활용해야 한다는 점을 다시 깨닫게 한 문제였다. 전체 코드 첨부하고 마친다.

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N;
    cin >> N;

    vector<char> inputVector(N);
    string inputStr;
    cin >> inputStr;

    for (int i = 0; i < inputStr.size(); i++)
    {
        inputVector[i] = inputStr[i];
    }

    int dir = 2;
    vector<vector<int>> maze(100, vector<int>(100, 1));

    int rValue = 50;
    int cValue = 50;
    int top = 50;
    int bottom = 50;
    int left = 50;
    int right = 50;

    maze[rValue][cValue] = 0;
    for (int i = 0; i < inputVector.size(); i++)
    {
        switch (inputVector[i])
        {
        case 'R':
            dir = (dir + 3) % 4;
            break;
        case 'L':
            dir = (dir + 1) % 4;
            break;
        case 'F':
            switch (dir)
            {
            case 0:
                maze[--rValue][cValue] = 0;
                top = min(top, rValue);
                break;
            case 1:
                maze[rValue][--cValue] = 0;
                left = min(left, cValue);
                break;
            case 2:
                maze[++rValue][cValue] = 0;
                bottom = max(bottom, rValue);
                break;
            case 3:
                maze[rValue][++cValue] = 0;
                right = max(right, cValue);
                break;
            }
            break;
        }
    }    

    for (int r = top; r <= bottom; r++)
    {
        for (int c = left; c <= right; c++)
        {
            if (maze[r][c] == 0)
            {
                cout << ".";
            }
            else
            {
                cout << "#";
            }
        }
        cout << "\n";
    }
}