[백준] 6593번 상범 빌딩

거북이·2023년 2월 15일
0

백준[골드5]

목록 보기
15/82
post-thumbnail

💡문제접근

  • 이전 포스팅에 있었던 [[백준] 7569번 토마토] 문제와 동일한 유형의 3차원 배열을 이용한 BFS 탐색 알고리즘 문제였다. 이전 문제를 해결한 경험이 있어서 쉽게 해결할 수 있을거라고 생각했는데 정말 오래 걸렸다. 그래도 다른 사람의 코드를 보지 않고 짠 코드라 기분 좋았다.^^;;

💡코드(메모리 : 34244KB, 시간 : 160ms)

from collections import deque
import sys
input = sys.stdin.readline

def BFS(z, x, y):
    queue = deque()
    queue.append((z, x, y))
    visited[z][x][y] = 1
    while queue:
        z, x, y = queue.popleft()
        dz = [0, 0, 0, 0, 1, -1]
        dy = [0, 1, 0, -1, 0, 0]
        dx = [-1, 0, 1, 0, 0, 0]
        for i in range(6):
            nx = x + dx[i]
            ny = y + dy[i]
            nz = z + dz[i]
            # 범위 밖이라면?
            if nz < 0 or nz >= L or nx < 0 or nx >= R or ny < 0 or ny >= C:
                continue
            # 금으로 막혀있어 지나갈 수 없는 칸인 #의 경우라면?
            if Building[nz][nx][ny] == "#":
                continue
            # 만약 도착점에 도착했다면?
            if Building[nz][nx][ny] == "E":
                print("Escaped in", visited[z][x][y], "minute(s).")
                return
            if 0 <= nz < L and 0 <= nx < R and 0 <= ny < C and visited[nz][nx][ny] == 0:
                if Building[nz][nx][ny] == ".":
                    visited[nz][nx][ny] = visited[z][x][y] + 1
                    queue.append((nz, nx, ny))
    # 탈출이 불가능한 경우라면?
    print("Trapped!")

while True:
    L, R, C = map(int, input().strip().split())
    if L == 0 and R == 0 and C == 0:
        break
    Building = [[] * R for _ in range(L)]
    visited = [[[0 for _ in range(C)] for _ in range(R)] for _ in range(L)]
    for l in range(L):  # 층 수
        for r in range(R):
            Building[l].append(list(input().strip()))
        input()

    for a in range(L):
        for b in range(R):
            for c in range(C):
                if Building[a][b][c] == "S":
                    BFS(a, b, c)

💡소요시간 : 2h

0개의 댓글