본문 바로가기
Data Science/알고리즘 공부

[백준][파이썬] 7569 토마토(2) - 3차원

by titaniumm 2020. 4. 1.

[핵심]

3차원 리스트를 활용하고 index를 맞게 조절해주느라 조금 헷갈렸다.

나는 기본적으로 z축을 먼저 정렬하여 [z][x][y]구조로 생각했다.

 

최단거리 문제는 BFS가 어울린다. 왜냐하면 동시에 카운팅을 해주어야 하니까.

*한번에 stack를 모두 처리하기 위해 while안에 포문을 한번더 설정해준것.

*초기값 모두 한번에 해결하기 위해 dfs안 while밖에 포문으로 stack에 넣어준것 

이 핵심이였다. 꼭 반복 연습하자

import collections #dq를 활용
m,n,h = map(int,input().split())
total =[]
for i in range(h):
    lit =[]
    for j in range(n):
        t = list(map(int,input().split()))
        lit.append(t)
    total.append(lit)
visited = [[[False for i in range(m)] for j in range(n)] for w in range(h)]
number = [[[0 for i in range(m)] for k in range(n)] for w in range(h)]
#3차원 좌표 움직임
dx =[0,0,1,-1,0,0]
dy =[1,-1,0,0,0,0]
dz =[0,0,0,0,+1,-1]

def bfs(stack,count):
    cont =count
    # 여러개가 동시에 늘어날떄는 while밖에서 초기값들 설정
    for i in range(n):
        for j in range(m):
            for _ in range(h):
                if total[_][i][j] == 1:
                    stack.append([i,j,_])
    while stack:
        cont += 1
        #한번 while을 돌때 모두 처리가 되야한다
        for tt in range(len(stack)):
            x = stack[0][0]
            y = stack[0][1]
            z = stack[0][2]
            stack.popleft()
            for i in range(6):
                X = x+dx[i]
                Y = y+dy[i]
                Z = z+dz[i]
                if 0<=X<n and 0<=Y<m and 0<=Z<h and total[Z][X][Y] == 0 and number[Z][X][Y] == 0:
                    number[Z][X][Y] = count
                    total[Z][X][Y] = 1
                    stack.append([X,Y,Z])
    return cont
dq= collections.deque()
tem = bfs(dq,0)
no=0
# 간단하게 할 수 있을텐데..
for i in range(n):
    for j in range(m):
        for k in range(h):
            if total[k][i][j] ==0:
                no = 1
if no ==1:
    print(-1)
else:
    print(tem-1)

댓글