백준/구현
백준 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;
}