[백준 6593] 상범 빌딩

Junyoung Park·2022년 2월 26일
0

코딩테스트

목록 보기
108/631
post-thumbnail

1. 문제 설명

상범 빌딩

2. 문제 분석

이차원 배열이 아니라 삼차원 배열로 오프셋을 구할 때 z축까지 고려하는 게 특징.

  • 시작 노드와 도착 노드를 각각 이미 탐색한 노드, 탐색 가능한 노드로 변경해주면 보다 편하게 BFS를 사용할 수 있다.

3. 나의 풀이

from collections import deque

dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]
# 3차원 이동시 다음 좌표를 구할 오프셋

while True:
    l, c, r = map(int, input().split())
    if l == 0 and c == 0 and r ==0 : break

    nodes = [[[] for _ in range(c)] for _ in range(l)]
    # 3차원 그래프 구현

    for i in range(l):
        for j in range(c):
            nodes[i][j] += input()
        input()

    queue = deque()
    for i in range(l):
        for j in range(c):
            for k in range(r):
                if nodes[i][j][k] == 'S':
                    start = [i, j, k]
                    nodes[i][j][k] = '#'
                    # 시작 노드 위치를 구한다. 방문한 것으로 간주, #로 마킹
                elif nodes[i][j][k] == 'E':
                    nodes[i][j][k] = '.'
                    end = [i, j, k]
                    # 도착 노드 위치를 구한다. 방문할 것으로 간주, .로 탐색 가능하도록 만들자.
                    break

    queue.append([start, 0])
    reachable = False
    while queue:
        pos, cur_cost = queue.popleft()
        height, row, col = pos


        if pos == end:
            reachable = True
            break
            # 도착 노드에 도착했다면 탐색 가능함을 알려주고 탈출한다.

        for z, x, y in zip(dz, dx, dy):
            next_height = height + z
            next_row = row + x
            next_col = col + y

            if next_row < 0 or next_col < 0 or next_height < 0 or next_row >= c or next_col >= r or next_height >= l: continue
            # 현재 좌표에서 이동 가능한 노드를 구하기 위해 오프셋을 더하자. 배열 범위에서 벗어나는지 체크.

            if nodes[next_height][next_row][next_col] == '.':
                # 다음 좌표가 아직 탐색하지 않은 노드라면 #로 마킹하고 탐색한다.
                nodes[next_height][next_row][next_col] = '#'
                queue.append([[next_height, next_row, next_col], cur_cost + 1])

    if reachable: print(f"Escaped in {cur_cost} minute(s).")
    else: print("Trapped!")
profile
JUST DO IT

0개의 댓글