[백준] 6593 - 상범 빌딩
1. 문제
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