백준/구현

백준 1347 c++ "미로 만들기" -PlusUltraCode-

PlusUltraCode 2025. 5. 28. 14:44

https://www.acmicpc.net/problem/1347

[필자 사고]

기본적인 BFS 구현 문제다.

다만 이 문제만의 특이한 재미난 점은 음수 idx가 발생할 수 있다느 ㄴ점이다.

필자는 최대인덱스들만 구했는데 최소 인덱스 또한 구해서 최대와 최소의 차이 만큼 배열의 크기를

설정해야 된다.

설정한 뒤 모든 인덱스들을 평행 이동 해줘야 원래 좌표값으로 이동시킬 수 있다.

 

이 부분이 매력적인 부분이란 생각이 든다.

[코드 해설]

Input()

  • 사용자로부터 명령어의 개수 N과 실제 명령 문자열 str을 입력받는 함수입니다.
  • 명령 문자열은 'F'(전진), 'L'(좌회전), 'R'(우회전)으로 구성됩니다.

RotateR()

  • 현재 바라보는 방향을 기준으로 우측(시계방향)으로 90도 회전시킵니다.
  • 방향은 dy, dx 배열을 통해 0~3 범위의 인덱스로 표현되며, (현재 인덱스 + 3) % 4 연산을 통해 회전을 구현합니다.

RotateL()

  • 현재 방향을 기준으로 좌측(반시계방향)으로 90도 회전시킵니다.
  • (현재 인덱스 + 1) % 4 연산으로 방향을 변경합니다.

updateBounds()

  • 현재 로봇의 위치(nowY, nowX)를 기준으로 지금까지 이동한 최솟값과 최댓값을 갱신하는 함수입니다.
  • 이 정보를 기반으로 전체 맵의 크기를 계산하게 됩니다.

Game_Start()

  • 로봇의 초기 위치를 path 벡터에 저장하고, 이후 입력된 명령 문자열을 순차적으로 해석하여 로봇의 이동 경로를 추적합니다.
  • 명령어가 F이면 현재 방향으로 한 칸 이동하고, R이면 우회전, L이면 좌회전합니다.
  • 이동할 때마다 좌표 경로를 기록하며, 최대/최소 범위도 계속 갱신합니다.
  • 모든 이동이 끝난 후에는 전체 경로가 포함된 최소 크기의 맵을 2차원 문자 벡터로 생성하고, 이동한 위치는 '.'로, 나머지는 '#'로 채웁니다.
  • 최종적으로 맵을 콘솔에 출력합니다.

main()

  • 프로그램의 시작점으로, 입력을 받고 경로 계산 및 결과 출력을 담당하는 Game_Start()를 호출합니다.

 

[소스 코드]

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

typedef pair<int, int> Node;
int dy[4] = { 0, -1, 0, 1 }; 
int dx[4] = { 1, 0, -1, 0 };

int N;
string str;
int forwardIdx = 3; 
int nowY = 0, nowX = 0;

int minY = 0, maxY = 0;
int minX = 0, maxX = 0;

vector<Node> path;

void RotateR() {
    forwardIdx = (forwardIdx + 3) % 4;
}

void RotateL() {
    forwardIdx = (forwardIdx + 1) % 4;
}

void Input() {
    cin >> N;
    cin >> str;
}

void updateBounds() {
    minY = min(minY, nowY);
    maxY = max(maxY, nowY);
    minX = min(minX, nowX);
    maxX = max(maxX, nowX);
}

void Game_Start() {
    path.push_back({ nowY, nowX }); 

    for (char c : str) {
        if (c == 'F') {
            nowY += dy[forwardIdx];
            nowX += dx[forwardIdx];
            updateBounds();
            path.push_back({ nowY, nowX });
        }
        else if (c == 'R') {
            RotateR();
        }
        else if (c == 'L') {
            RotateL();
        }
    }

    int height = maxY - minY + 1;
    int width = maxX - minX + 1;

    vector<vector<char>> myMap(height, vector<char>(width, '#'));

    for (Node node : path) {
        int y = node.first - minY;
        int x = node.second - minX;
        myMap[y][x] = '.';
    }

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            cout << myMap[i][j];
        }
        cout << '\n';
    }
}

int main() {
    Input();
    Game_Start();
    return 0;
}