코딩 테스트/Baekjoon

G5 7569. 토마토

  • -
728x90
반응형

문제 보기 :  7569번: 토마토


문제

  • 정답률 : 42%


작성 코드

m,n,h = map(int,input().split()) #가로 세로 높이
arr = [[list(map(int,input().split())) for _ in range(n)] for i in range(h) ]
visited = [[[False]*m for _ in range(n)] for i in range(h) ]

from collections import deque
direction = [(-1,0,0),(1,0,0),(0,-1,0),(0,1,0),(0,0,-1),(0,0,1)]
dd = deque()

for i in range(h): #높이
    for j in range(n): #세로
        for k in range(m): #가로
            if arr[i][j][k]==1:
                dd.append((k,j,i))

def spread(graph):
    while dd:
        x,y,z = dd.popleft()
        for dx,dy,dz in direction:
            xx = x+dx ; yy = y+dy ; zz = z+dz
            if 0<=xx<m and 0<=yy<n and 0<=zz<h and graph[zz][yy][xx] == 0:
                graph[zz][yy][xx] = graph[z][y][x]+1
                dd.append((xx,yy,zz))

spread(arr)

maxx = 0
for ls in arr:
    for l in ls:
        for i in l:
            if i == 0:
                print(-1)
                exit(0)
        maxx = max(maxx,max(l))
print(maxx-1)

풀이

3차원 배열이라 x,y,z 조건을 사용하는데, 리스트(arr)는 순서가 반대로 된다는 점을 고려해야한다.

문제 풀이에서 헤맸던 부분은 1 근처에 있는 모든 값을 처리해야한다는거.
예를 들어, 입력이 아래와 같이 주어졌다고 한다.
5 3 1
0 -1 0 0 0
0 -1 0 1 1
0 0 0 1 1

1일 후에는
0 -1 0 2 2
0 -1 2 1 1
0 0 2 1 1
이렇게 바뀌어야한다.

근데 기존의 방법대로 bfs를 구현하면(dd를 함수 안에 넣으면)
0 -1 0 2 0
0 -1 2 1 1
0 0 0 1 1
이렇게 밖에 안돼서 답에 오류가 생긴다.

그래서 deque를 밖으로 빼서 1인 토마토 좌표를 모두 구한 다음 시작했다.

320x100
728x90

'코딩 테스트 > Baekjoon' 카테고리의 다른 글

S4 2217. 로프  (0) 2024.11.27
S4 1065. 한수  (1) 2024.11.27
S4 1764. 듣보잡  (0) 2024.11.26
S2 4949. 균형잡힌 세상  (0) 2024.11.25
S2 1182. 부분수열의 합  (0) 2024.11.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.