1. 문제

6593번: 상범 빌딩



2. 개요

상범 빌딩에서 탈출하려고 한다.

빌딩은 각 변의 길이가 1인 정육면체로 이루어져있으며 각 정육면체는 이동가능한 곳과 이동 불가능한 곳이 있다. 동서남북상하의 6방향으로 1분의 시간을 들여 움직일 수 있다.

빌딩의 가로, 세로, 높이와 각 구역의 정보가 주어졌을 때 탈출이 가능하다면

“Escaped in (최소시간) minute(s)”를, 불가능하다면 “Trapped!” 를 출력하는 문제.



3. 풀이 및 코드

3-1. 풀이

빌딩의 정보를 입력받으며 빌딩을 나타낼 리스트를 작성해둔다.

이 때, S 또는 E가 등장한다면 각각의 위치를 시작위치, 탈출위치로 저장해둔다.

시작위치를 큐에 넣고 방문처리를 한 뒤, 동서남북상하 6방향으로 BFS를 실행한다.

다음 이동예정인 곳이 이동 가능하거나 이미 방문한 곳이 아니라면 이동예정인 곳의 visited값을 현재 위치의 visited값 + 1 처리를 해주고, 큐에 넣는 작업을 반복해준다.

큐가 비거나 탈출위치에 방문처리가 되었다면 visited배열의 탈출위치의 값을 확인한다.

값이 초기값과 동일하다면 탈출이 불가능하단 의미이므로 “Trapped!” 를 출력한다.

값이 초기값 이상이라면 탈출 가능하단 얘기이므로 포맷에 맞게 출력해준다.

3-2. Python

import sys
from collections import deque

dirZ, dirY, dirX = [-1, 1, 0, 0, 0, 0], [0, 0, -1, 1, 0, 0], [0, 0, 0, 0, -1, 1]

while True:
    L, R, C = map(int, sys.stdin.readline().split())

    if L == R == C == 0:
        break

    s = [-1, -1, -1]
    e = [-1, -1, -1]

    visited = [[[0 for _ in range(C)] for _ in range(R)] for _ in range(L)]

    building = []

    for i in range(L):
        building.append([])
        for j in range(R+1):
            input = list(sys.stdin.readline().rstrip())

            if input:
                building[i].append(input)

                for k in range(C):
                    if input[k] == 'S':
                        s = [i, j, k]

                    elif input[k] == 'E':
                        e = [i, j, k]

    q = deque()
    q.append(s)
    visited[s[0]][s[1]][s[2]] = 1

    while q and visited[e[0]][e[1]][e[2]] == 0:
        nowZ, nowY, nowX = q.popleft()

        for i in range(6):
            nextZ, nextY, nextX = nowZ + dirZ[i], nowY + dirY[i], nowX + dirX[i]

            if nextZ < 0 or nextZ >= L or nextY < 0 or nextY >= R or nextX < 0 or nextX >= C:
                continue

            if building[nextZ][nextY][nextX] == '#':
                continue

            if visited[nextZ][nextY][nextX] > 0:
                continue

            visited[nextZ][nextY][nextX] = visited[nowZ][nowY][nowX] + 1
            q.append([nextZ, nextY, nextX])

    if visited[e[0]][e[1]][e[2]] > 0:
        print("Escaped in %d minute(s)." %(visited[e[0]][e[1]][e[2]] - 1))

    else:
        print("Trapped!")

3-3. C#

namespace boj_6593
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] dirZ = { -1, 1, 0, 0, 0, 0 };
            int[] dirY = { 0, 0, -1, 1, 0, 0 };
            int[] dirX = { 0, 0, 0, 0, -1, 1 };

            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            while (true)
            {
                string[] input = sr.ReadLine().Split();

                if (input[0] == "0" && input[1] == "0" && input[2] == "0")
                {
                    sw.Close();
                    break;
                }
                    

                int L = int.Parse(input[0]);
                int R = int.Parse(input[1]);
                int C = int.Parse(input[2]);

                int[] s = { -1, -1, -1 };
                int[] e = { -1, -1, -1 };

                int[,,] visited = new int[L, R, C];
                char[,,] building = new char[L, R, C];

                for (int i = 0; i < L; i++)
                {
                    for (int j = 0; j < R + 1; j++)
                    {
                        string info = sr.ReadLine();

                        if (info == "")
                            continue;

                        for (int k = 0; k < C; k++)
                        {
                            building[i, j, k] = info[k];

                            if (info[k] == 'S')
                            {
                                s[0] = i;
                                s[1] = j;
                                s[2] = k;
                            }
                                

                            else if (info[k] == 'E')
                            {
                                e[0] = i;
                                e[1] = j;
                                e[2] = k;
                            }
                        }
                    }
                }

                Queue<int[]> q = new Queue<int[]>();
                q.Enqueue(s);
                visited[s[0], s[1], s[2]] = 1;

                while (q.Count > 0 && visited[e[0], e[1], e[2]] == 0)
                {
                    int[] now = q.Dequeue();
                    int nowZ = now[0];
                    int nowY = now[1];
                    int nowX = now[2];

                    for (int i = 0; i < 6; i++)
                    {
                        int nextZ = nowZ + dirZ[i];
                        int nextY = nowY + dirY[i];
                        int nextX = nowX + dirX[i];

                        if (nextZ < 0 || nextZ >= L || nextY < 0 || nextY >= R || nextX < 0 || nextX >= C)
                            continue;

                        if (building[nextZ, nextY, nextX] == '#')
                            continue;

                        if (visited[nextZ, nextY, nextX] > 0)
                            continue;

                        visited[nextZ, nextY, nextX] = visited[nowZ, nowY, nowX] + 1;
                        q.Enqueue(new int[] { nextZ, nextY, nextX });
                    }
                }

                if (visited[e[0], e[1], e[2]] > 0)
                    sw.WriteLine($"Escaped in {visited[e[0], e[1], e[2]] - 1} minute(s).");

                else
                    sw.WriteLine("Trapped!");
            }
        }
    }
}

Comments