코테 노트/백준

백준 7576 토마토 Python 3

화요밍 2022. 2. 4. 23:54
728x90
반응형

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

 

7576번: 토마토

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

www.acmicpc.net

 

최종 코드

 

GitHub - hwayeon351/BEAKJOON-Algorithms: 백준 알고리즘 소스 코드 모음

백준 알고리즘 소스 코드 모음. Contribute to hwayeon351/BEAKJOON-Algorithms development by creating an account on GitHub.

github.com

import sys
from collections import deque
imput = sys.stdin.readline
M, N = map(int, input().split())
box = list()
q = deque(list())
for i in range(N):
    box.append(list(map(int, input().split())))
    for j in range(M):
        if box[i][j] == 1: q.append([j, i, 0])
if not q: print(-1)
else:
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    while q:
        x, y, day = q.popleft()
        for ddx, ddy in zip(dx, dy):
            nx = x + ddx
            ny = y + ddy
            if 0 <= nx < M and 0 <= ny < N and box[ny][nx] == 0:
                box[ny][nx] = 1
                q.append([nx, ny, day+1])
    for row in box:
        if 0 in row:
            print(-1)
            break
    else:
        print(day)

풀이 과정

풀이 시간 24분

import sys
from collections import deque

imput = sys.stdin.readline
M, N = map(int, input().split())

#토마토들이 담긴 박스
box = list()
q = deque(list())
for i in range(N):
    box.append(list(map(int, input().split())))
    for j in range(M):
    	#익은 토마토인 경우, 해당 토마토를 기준으로 인접한 토마토를 탐색하기 위해 (x, y) 위치와 시작일인 0을 큐에 담는다
        if box[i][j] == 1: q.append([j, i, 0])
        
#익은 토마토가 한 개도 없는 경우, -1을 출력한다
if not q: print(-1)

#익은 토마토가 있는 경우, BFS를 수행한다
else:
	#좌, 상, 우, 하
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    
    while q:
    	#현재 익은 토마토의 위치와 날짜
        x, y, day = q.popleft()
        
        #인접한 4 방향 탐색
        for ddx, ddy in zip(dx, dy):
            nx = x + ddx
            ny = y + ddy
            #해당 방향에 안 익은 토마토가 있는 경우,
            if 0 <= nx < M and 0 <= ny < N and box[ny][nx] == 0:
            	#하루가 지나 토마토가 익는다
                box[ny][nx] = 1
                q.append([nx, ny, day+1])
    
    #박스 안에 안 익은 토마토가 있는 경우, -1을 출력한다
    for row in box:
        if 0 in row:
            print(-1)
            break
    #모든 토마토가 익은 경우, day를 출력한다
    else:
        print(day)

#시간복잡도 = O(N*M), 공간복잡도 = O(N*M)

 

728x90
반응형

'코테 노트 > 백준' 카테고리의 다른 글

백준 6593 상범 빌딩 Python 3  (0) 2022.02.06
백준 5014 스타트링크 Python 3  (0) 2022.02.05
백준 1697 숨바꼭질 Python 3  (0) 2022.02.04
백준 2178 미로 탐색 Python 3  (0) 2022.02.03
백준 1260 DFS와 BFS Python 3  (0) 2022.02.03