본문 바로가기
Algorithm/Graph

[파이썬] 백준 7576,7579 : 토마토 (골드5)

by 베짱이28호 2023. 5. 10.

[파이썬] 백준 7576 ,7579: 토마토 (골드5)

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net


문제


풀이

0. 방향성 생각

최단거리 문제라서 BFS로 접근. 마지막 출력하는 부분만 조심하면 별 다른 조건도 없다.

 

1. 입력

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

w,h = map(int,input().split())
arr = []
q = deque()
for i in range(h):
    s = list(map(int,input().split()))
    for j in range(w):
        if s[j]==1:
            q.append((j,i))
    arr.append(s)

가로 세로 받아주고 시작점인 1들의 좌표들을 큐에 추가

어레이를 다 만들고 탐색해도 되는데 받으면서 진행

2. BFS 함수 정의

step = [[1,-1,0,0],[0,0,1,-1]]
def bfs():
    while q:
        x,y = q.popleft()
        for i in range(4):
            nx = x + step[0][i]
            ny = y + step[1][i]
            if 0<=nx<w and 0<=ny<h :
                if arr[ny][nx] == 0 :
                    arr[ny][nx] = arr[y][x] + 1
                    q.append((nx,ny))
bfs()

함수 내부에서 쓸 상하좌우 방향을 위해 step을 정의해주고 탐색.

탐색 시 안익었으면 현재 arr 값 +1로 해주고 다음 탐색을 위해 큐에 추가.

 

3. 출력

day,fail = 0,False
for i in range(h):
    if 0 in arr[i] :
        print(-1)
        fail = True
        break
    if day < max(arr[i]) :
        day = max(arr[i])
        
if not fail :
    print(day-1)

탐색 시 0이 있으면 -1 출력하고 for문 탈출, fail이 True이므로 안익었으므로 출력하지 않음

탐색 시 모두 익었으면 1부터 시작했으므로 -1 해주기


전체 코드

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

w,h = map(int,input().split())
arr = []
q = deque()
for i in range(h):
    s = list(map(int,input().split()))
    for j in range(w):
        if s[j]==1:
            q.append((j,i))
    arr.append(s)

step = [[1,-1,0,0],[0,0,1,-1]]
def bfs():
    while q:
        x,y = q.popleft()
        for i in range(4):
            nx = x + step[0][i]
            ny = y + step[1][i]
            if 0<=nx<w and 0<=ny<h :
                if arr[ny][nx] == 0 :
                    arr[ny][nx] = arr[y][x] + 1
                    q.append((nx,ny))
bfs()

day,fail = 0,False
for i in range(h):
    if 0 in arr[i] :
        print(-1)
        fail = True
        break
    if day < max(arr[i]) :
        day = max(arr[i])
        
if not fail :
    print(day-1)

전형적인 2차원 배열 탐색문제라 골드5 좀 후한 느낌이 있다.

 

 

번외

이거는 7576 3차원 배열로 풀기. 2차원으로도 풀 수는 있다.

주의할점은 마지막 출력시 return처럼 한번에 탈출하는 형태가 아니라서 break 대신 exit(0) 써야한답니다..

이거까진 생각을 안해서 한 번 틀렸다.

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

w,h,d = map(int,input().split())
arr = []
q = deque()
for k in range(d):
    temp = []
    for i in range(h):
        s = list(map(int,input().split()))
        for j in range(w):
            if s[j]==1:
                q.append((j,i,k))
        temp.append(s)
    arr.append(temp)

step = [[1,-1,0,0,0,0],[0,0,1,-1,0,0],[0,0,0,0,1,-1]]
def bfs():
    while q:
        x,y,z = q.popleft()
        for i in range(6):
            nx = x + step[0][i]
            ny = y + step[1][i]
            nz = z + step[2][i]
            if 0<=nx<w and 0<=ny<h and 0<=nz<d:
                if arr[nz][ny][nx] == 0 :
                    arr[nz][ny][nx] = arr[z][y][x] + 1
                    q.append((nx,ny,nz))
bfs()

day,fail = 0,False
for k in range(d):
    for i in range(h):
        if 0 in arr[k][i] :
            print(-1)
            fail = True
            exit(0)
        if day < max(arr[k][i]) :
            day = max(arr[k][i])
        
if not fail :
    print(day-1)

댓글