개미의 개열시미 프로그래밍

[알고리즘] 백준7569 토마토 - 파이썬 본문

알고리즘/DFS, BFS, 백트래킹

[알고리즘] 백준7569 토마토 - 파이썬

YunHyeok 2021. 6. 6. 19:24
728x90
반응형

이번에는 저번에 풀었던 토마토를 3차원 배열을 활용해서 풀어야 하는 문제였습니다. 쉽게 풀 수 있을 거라 생각했지만 bfs로 위, 아래, 왼쪽, 오른쪽, 앞, 뒤를 탐색하는 부분에서 막혔고 풀이를 보면서 제 방식대로 다시 풀어보았습니다. 

 

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

 

풀이코드

from collections import deque
import sys
input = sys.stdin.readline

# 위, 아래, 왼쪽, 오른쪽, 앞, 뒤
dx = [1, -1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]

m, n, h = map(int, input().split())

# 3차원 배열 생성
graph = []
for _ in range(h):
    g = []
    for j in range(n):
        g.append(list(map(int, input().split())))
    graph.insert(0, g)
# print("bfs 적용 전",graph) #<=====================

def bfs():
    while q:
        a, b, c = q.popleft()

        for i in range(6):
            x = a + dx[i]
            y = b + dy[i]
            z = c + dz[i]
            if 0 <= x < n and 0 <= y < m and 0 <= z < h and graph[z][x][y] == 0:
                q.append([x, y, z])
                graph[z][x][y] = graph[c][a][b] + 1


q = deque()
isTrue = False

for z in range(h):
    for x in range(n):
        for y in range(m):
            if graph[z][x][y] == 1:
                q.append([x, y, z])

bfs()
# print("bfs 적용 후", graph) #<=====================

max_num = 0
for z in range(h):
    for x in range(n):
        for y in range(m):
            if graph[z][x][y] == 0:
                isTrue = True
            max_num = max(max_num, graph[z][x][y])

if isTrue == True:
    print(-1)
else:
    print(max_num - 1)

 

문제풀이 

: 위, 아래, 왼쪽, 오른쪽, 앞, 뒤를 탐색하기 위해 세 개의 배열 dx, dy, dz를 선언하는 부분과 반복문이 하나씩 더 늘었다는 점이 핵심인 것 같습니다. 막상 풀이를 보고 나니 허무했던 문제였습니다.

728x90
반응형
Comments