[ 백준 ] 1347 / 미로 만들기

金弘均·2021년 9월 14일
0

Baekjoon Online Judge

목록 보기
15/228
post-thumbnail
post-custom-banner

# Appreciation

/*
 * Problem :: 1347 / 미로 만들기
 *
 * Kind :: Simulation
 *
 * Insight
 * - 홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다
 *   => 어디에 서있는지는 모른다
 *   홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다
 *   => 이미 걸었던 칸을 다시 걸었을 수도 있다
 *   + 현재 칸의 (y,x) 를 (0,0) 으로 가정하자
 *     그리고 문자열에서 주어지는 'F', 'L', 'R' 대로 착실히 움직이는데
 *     이 방문한 칸의 좌표를 Set 에다 넣어주자
 *     # 직사각형의 미로에서 시작 칸인 (0,0) 기준
 *       가장 왼쪽 아래 칸의 좌표 (lly, llx) 를 구하고
 *       가장 오른쪽 위 칸의 좌표 (ury, urx) 를 구해서
 *       직사각형의 가로와 세로의 길이를 구해주자
 *       -> 가로와 세로의 길이를 바탕으로 2차원 char 배열을 선언한 뒤
 *          Set 에 넣어진 좌표들 (y,x) 에 (lly, llx) 를 빼서
 *          기준을 가장 왼쪽 아래 칸을 (0,0) 으로 맞춰주며 미로를 그려주자
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <set>
#include <cstring>

using namespace std;

#define endl '\n'

// Set up : Global Variables
int dy[4] = {-1, 0, 0, +1};
int dx[4] = {0, -1, +1, 0};
enum { N, L, R, S };
enum { RL, RR };
int D[4][2] = { {L, R}, {S, N}, {N, S}, {R, L} };

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int L; cin >> L;
    string C; cin >> C;

    // Process
    int cy = 0, cx = 0; /* 시작 칸의 좌표 */
    int lly, ury, llx, urx; /* 가장 왼쪽 아래 칸의 좌표, 가장 오른쪽 위 칸의 좌표 */
    lly = ury = cy;
    llx = urx = cx;
    set<pair<int,int>> M; /* 현재 칸 기준 방문한 칸의 좌표들이 저장된 Set */
    M.insert({cy, cx}); /* 현재 칸을 Set 에 추가 */
    int d = S; /* 초기 방향은 남쪽 */
    for (char c : C) {
        switch (c) {
            case 'R': d = D[d][RR]; break; /* 방향을 오른쪽으로 전환 */
            case 'L': d = D[d][RL]; break; /* 방향을 왼쪽으로 전환 */
            case 'F':
                cy += dy[d], cx += dx[d]; /* 현재 방향으로 한 칸 이동 */
                M.insert({cy, cx}); /* 현재 칸을 Set 에 추가 */
                lly = min(lly, cy), ury = max(ury, cy); /* lly, ury 갱신 */
                llx = min(llx, cx), urx = max(urx, cx); /* llx, urx 갱신 */
                break;
            default: throw runtime_error("Invalid Command");
        }
    }

    int r = ury-lly+1; /* 미로의 세로 길이 */
    int c = urx-llx+1; /* 미로의 가로 길이 */

    char A[r][c];
    memset(A, '#', sizeof(A));
    for (auto [y, x] : M) {
        /* 시작 칸 좌표에서 가장 왼쪽 아래 칸 좌표로 기준을 옮김 */
        A[y-lly][x-llx] = '.';
    }

    // Control : Output
    for (int i=0; i<r; i++) {
        for (int j=0; j<c; j++) {
            cout << A[i][j];
        } cout << endl;
    }
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이
post-custom-banner

0개의 댓글