알고리즘 문제(SOL)

[백준/6593/파이썬] 상범 빌딩

https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

  • 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다.
  • 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다.
  • 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다.
  • 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서만 탈출할 수 있다.
  • 당신은 상범 빌딩을 탈출할 수 있을까? 만약 그렇다면 얼마나 걸릴까?

 

입력이 생소하게 느껴져서, board를 받는 부분부터가 쉽지 않은 문제였다.

솔직히, board를 받는 부분이 3차원이 되어서, 파이썬에서 3차원 배열을 어떻게 받는지 연습을 좀 하고왔다.

F,N,M = map(int,input().split())
building=[[[] for _ in range(N)] for _ in range(F)]
for i in range(F):
	building[i]=[list(map(str,input().rstrip())) for _ in range(N)]
	input()

1. Floor *N*M 의 크기로 이루어져있는 3차원 배열을 선언한 뒤,

2. 각각의 층 별로, 정보를 저장하는 방식으로 진행하였다. 1개의 층마다 2차원 배열을 갖고 있으므로, 

- building의 초기 상태는, [ [[],[],[],[]] , [[],[],[],[]] , [[],[],[],[]] ] 이런 상태일거다.

- building의 1층부터, 한줄씩, N번 집어넣는 과정을 거친다.

- 그리고, 입력이 끝난 후, 공백이 한줄 들어오기 때문에, 공백도 받아준다.

 

이 부분만 이해가 잘되면, 논리는 똑같다. 단지, 2차원 -> 3차원이 되면서, 상대좌표도 6개가 된 문제이다.

 

from collections import deque
dz=(0,0,0,0,1,-1)
dx=(1,0,-1,0,0,0)
dy=(0,1,0,-1,0,0)

def is_valid_coord(z,y,x):
	return 0<=z<F and 0<=y<N and 0<=x<M
def bfs(z,y,x):
	dq=deque()
	dq.append((z,y,x))
	v_chk[z][y][x] = 1
	while dq:
		z,y,x=dq.popleft()
		for k in range(6):
			nx = x + dx[k]
			ny = y + dy[k]
			nz = z + dz[k]
			if is_valid_coord(nz,ny,nx):
				if building[nz][ny][nx] =='E':
					print("Escaped in {0} minute(s).".format(v_chk[z][y][x]))
					return
				if building[nz][ny][nx] =='.' and v_chk[nz][ny][nx] == 0:
					v_chk[nz][ny][nx] = v_chk[z][y][x] + 1
					dq.append((nz,ny,nx))
	print("Trapped!")
while True:
	F,N,M = map(int,input().split())
	if F+N+M==0 :
		break
	building=[[[] for _ in range(N)] for _ in range(F)]
	#print(building)
	v_chk=[[[0]*M for _ in range(N)] for _ in range(F)]
	for i in range(F):
		building[i]=[list(map(str,input().rstrip())) for _ in range(N)]
		input()
	#print(building)
	for i in range(F):
		for k in range(N):
			for j in range(M):
				if building[i][k][j]=='S':
					bfs(i,k,j)