문제
6593번: 상범 빌딩
당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어
www.acmicpc.net
알고리즘
- bfs 탐색을 통해 문제를 수행한다.
- 3차원 그래프를 통해 문제를 수행하는 것이라 까다로울 수 있지만 집중해서 풀면 다른 bfs 탐색 문제와 다를 게 없다.
코드
import sys
from collections import deque
# bfs 탐색
def bfs():
queue = deque([[sz, sy, sx]])
dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]
while queue:
z, y, x = queue.popleft()
# 도착지점이라면 출력값 리턴
if x == ex and y == ey and z == ez:
return "Escaped in {0} minute(s).".format(visited[z][y][x])
# 반복문을 통해 동/서/남/북/상/하 탐색
for i in range(6):
nx = x + dx[i]
ny = y + dy[i]
nz = z + dz[i]
# 범위내에 있고 탐색하지 않았다면 탐색
if 0 <= nx < c and 0 <= ny < r and 0 <= nz < l and visited[nz][ny][nx] == 0:
# 탐색하는 곳이 금이 아니라면 탐색
if graph[nz][ny][nx] == "." or graph[nz][ny][nx] == "E":
visited[nz][ny][nx] = visited[z][y][x] + 1
queue.append([nz, ny, nx])
# 도착지점에 도착하지 못했다면 Trapped! 리턴
return "Trapped!"
# 반복문을 통해 각 테스트를 확인
while True:
l, r, c = map(int, sys.stdin.readline().split())
# L, R, C가 모두 0이면 반복을 멈춘다.
if l == 0 and r == 0 and c == 0:
break
graph = [[] * r for _ in range(l)]
visited = [[[0 for _ in range(c)] for _ in range(r)] for _ in range(l)]
# 반복문을 통해 그래프를 나타낸다.
for i in range(l):
for _ in range(r):
graph[i].append(list(map(str, sys.stdin.readline().strip())))
sys.stdin.readline()
# 반복문을 통해 S와 E의 좌표를 확인한다.
for i in range(l):
for j in range(r):
for k in range(c):
if graph[i][j][k] == "S":
sx, sy, sz = k, j, i
elif graph[i][j][k] == "E":
ex, ey, ez = k, j, i
print(bfs())
github
GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 11404번(파이썬): 플로이드 (0) | 2022.06.19 |
---|---|
[baekjoon] 백준 2580번(파이썬): 스도쿠 (1) | 2022.06.18 |
[baekjoon] 백준 5582번(파이썬): 공통 부분 문자열 (0) | 2022.06.16 |
[baekjoon] 백준 9084번(파이썬): 동전 (0) | 2022.06.15 |
[baekjoon] 백준 13023번(파이썬): ABCDE (0) | 2022.06.14 |