히치키치

[백준] 7579번 : 토마토 - Python(파이썬) 본문

알고리즘 스터디

[백준] 7579번 : 토마토 - Python(파이썬)

히치키치 2022. 6. 2. 17:55

문제

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

 

7576번: 토마토

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

www.acmicpc.net

 

포인트

1. 입력 :

관념적으로 (행, 열)으로 들어지만 해당 문제는 (열, 행)으로 들어옴

M=열, N=행으로 입력 받는 코드 작성하여 헷갈리지 않도록 하자

2. 시작점이 여러 개

미로탈출(백준 2178)과 다르게 익은 토마토(시작점)가 여러개 존재함

여러 시작점에 대한 4방향 탐색 동시에 이뤄져야 함 

익은 토마토가 존재하는 좌표를 모두 que에 넣자

3. 탐색 불필요한 경우 존재

토마토가 존재하지 않는 곳(-1) 이 존재함

별 다른 처리/코드 작성 없이 오직 토마토가 아직 익지 않은 경우(0)에만 기준점+1 되도록 작성

4. Flag=False 사용해 결과값 출력

이중 리스트에 특정 값 존재하면 -1로 결과 나오게 해야 함

방법 1 ) 이중 for문 돌다가 모두 중지하려면 결과값 출력 후 exit(1) 사용

방법 2 ) 이중 for문 돌다가 특정값 나오면 flag=True 로 값 수정

              이후 flag 값에 따라 결과값 출력

5. 이중리스트 내 최대값 출력

map 함수 사용

참고 ) https://devbull.xyz/python-2caweon-baeyeolyi-coedaegabs-coesogabs-cajgi/

 

Python 2차원 배열의 최대값, 최소값 찾기

(update: 2022-04-22) HM Kim 님 덕분에 잘못된 정보를 찾았습니다. 감사합니다. 처음 드는 생각 가끔 알고리즘 문제풀이를 하다보면 어떤 iterable의 최대값 또는 최소값을 찾아야 하는 경우가 발생한다.

devbull.xyz

 

전체 코드

 

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

M,N=map(int, input().split())
graph=[list(map(int, input().split())) for _ in range(N)]

dx=[1,-1,0,0]
dy=[0,0,1,-1]
que=deque([])
res=0
flag=False

#print(N,M, graph, visited, dx,dy)


for i in range(N):
    for j in range(M):
        if graph[i][j]==1:
            que.append([i,j])

def bfs():
    while que:
        x,y=que.popleft()
        for k in range(4):
            nx, ny=x+dx[k], y+dy[k]
            if 0<=nx<N and 0<=ny<M and graph[nx][ny]==0:
                que.append([nx, ny])
                graph[nx][ny]=graph[x][y]+1


bfs()
for i in range(N):
    for j in range(M):
        if graph[i][j]==0:
            flag=True
            break

if flag:
    print(-1)
else:
    print(max(map(max,graph))-1)
Comments