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

 

1347번: 미로 만들기

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다. 입력으로 홍준이가 적은 내용이 주어진다. 문자열로 이루어져 있으며, 모든 문자 하나는

www.acmicpc.net

문제에서 홍준이는 자기의 움직임을 모두 적는다. 홍준이가 적은 내용의 길이 N이과 그 내용이 주어진다.

미로가 몇 칸인지 알 수 없으므로 미로를 만들 배열의 크기를 101*101로 잡았다.

문제에서 N이 0보다 크고 50보다 작다고 했으므로 상하좌우 어떤 방향이든 한 방향으로만 가는 경우(가장 멀리 가는 경우)를 생각해서 넉넉하게 잡았다.

 

 

시작점은 배열의 가운데 쯤인 50,50에서 시작하면서 적은 내용에 맞게 움직인다.

처음에 남쪽을 바라보고 있다고 했으므로 처음 방향은(1,0)이다.

방향 전환을 쉽게 할 수 있도록 dx, dy배열에 남쪽에서부터 시계방향 순서로(반대도 상관없다) 방향을 저장해 둔다.

R 인 경우 오른쪽으로 방향을 전환하므로 dir+1을 해주면 되지만 3번째는 index를 넘어가버리기 때문에 % 연산을

이용하여 (dir+1) % 4를 해주면 된다.

마찬가지로 L은 왼쪽 방향으로 회전하므로 dx, dy배열의 앞의 칸으로 이동하기 위해 (dir+3) % 4를 해주면 된다.

 

 

가장 중요한 직사각형 미로를 출력해주기 위해서 직사각형의 시작점과 끝점을 알아야 한다.

시작점과 끝점을 홍준이의 시작 위치(50,50)로 잡아두고 이동할 때마다 비교해서

x, y의 최솟값(왼쪽 맨 위)이 시작점, x,y의 최댓값(오른쪽 맨 아래)이 끝점이 되도록 해준다.

 

 

그러면 내용대로 모두 움직인 후에 직사각형 범위만큼을 출력해주면 되는데

. 이 없는 경우에 #을 출력하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <string>
using namespace std;
 
 
int n;
string s;
char map[101][101];
 
//남,서,북,동 순서
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,-1,0,1 };
 
 
void solve() {
    //직사각형의 왼쪽 위 좌표(sx,sy)와 오른쪽 아래 좌표(ex,ey)
    int sx = 50;
    int sy = 50;
    int ex = 50;
    int ey = 50;
 
 
    //시작점을 가운데 칸으로 설정
    int x = 50;
    int y = 50;
    int dir = 0;
    map[x][y] = '.';
 
 
    for (int i = 0; i < n; i++) {
        if (s[i] == 'R') {
            //오른쪽으로 방향 회전
            dir = (dir + 1) % 4;
        }
        else if (s[i] == 'L') {
            //왼쪽으로 방향 회전
            dir = (dir + 3) % 4;
        }
        else if (s[i] == 'F') {
            //앞으로 이동
            x += dx[dir];
            y += dy[dir];
            map[x][y] = '.';
 
 
            //이동한 경우 직사각형의 좌표와 비교해준다.
            if (x < sx) sx = x;
            if (y < sy) sy = y;
            if (x > ex) ex = x;
            if (y > ey) ey = y;
        }
 
        
    }
 
 
    //직사각형을 출력
    // '.' 이 아닌 경우에는 벽이므로 '#'을 출력
    for (int i = sx; i <= ex; i++) {
        for (int j = sy; j <= ey; j++) {
            if (map[i][j] == '.')
                cout << map[i][j];
            else
                cout << '#';
        }
        cout << '\n';
    }
 
    
 
}
 
int main() {
 
    cin >> n;
    cin >> s;
 
    solve();
    
    return 0;
}
Colored by Color Scripter
 

'BOJ' 카테고리의 다른 글

[BOJ] 2638. 치즈  (0) 2019.07.08
[BOJ] 2636. 치즈  (0) 2019.07.08
[BOJ] 14620. 꽃길  (0) 2019.07.06
[BOJ] 14889. 스타트와 링크  (0) 2019.07.06
[BOJ] 3184. 양  (0) 2019.07.06

+ Recent posts