본문 바로가기
🔅코딩테스트 공부🔅/❗백준

[백준] 7576번 토마토 (python)

by 윤무무 2023. 2. 12.

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

 

7576번: 토마토

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

www.acmicpc.net

 

1. 내가 작성한 코드
from collections import deque

n, m = map(int, input().split())
arr = []

for i in range(m):
  arr.append(list(map(int, input().split())))

arr2 = [] #처음 시작이 1인 좌표
cnt = 0

for i in range(m):
  for j in range(n):
    if arr[i][j] == 1:
      arr2.append((i,j))

def bfs():
  global cnt
  dx = [-1,1,0,0]
  dy = [0,0,-1,1]
  
  arr1 = deque()
  queue = deque()

  for i in arr2:
    arr1.append(i)
    queue.append(i)

  while queue:
    while arr1:
      x,y = arr1.popleft()
      queue.popleft()
      for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if nx<0 or ny<0 or nx>=m or ny>=n:
          continue
        if arr[nx][ny] == -1:
          continue
        if arr[nx][ny] == 0:
          arr[nx][ny] = 1
          queue.append((nx,ny))
    for i in queue:
      arr1.append(i)
    cnt+=1
  return True

bfs()

check = 0
for i in range(m):
  if 0 in arr[i]:
    check +=1
    break

if check == 0:
  print(cnt-1)
else: print(-1)

생각을 넘나리 복잡하게 해서 2중 while문을 돌렸다 키키

그냥 평소처럼 while문 한 개를 쓰고, max 값을 뽑아내면 되는 문제~!~!

2. 수정 코드
from collections import deque

n, m = map(int, input().split()) #가로 세로 input

arr = [list(map(int, input().split())) for _ in range(m)] #토마토 첫 상태
queue = deque()
cnt = 0

for i in range(m): #현재 익어있는 토마토를 모두 queue에 append
  for j in range(n):
    if arr[i][j] == 1:
      queue.append((i,j))

def bfs():
  dx = [-1,1,0,0]
  dy = [0,0,-1,1]

  while queue:
    x,y = queue.popleft()
    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if nx<0 or ny<0 or nx>=m or ny>=n:
        continue
      if arr[nx][ny] == -1:
        continue
      if arr[nx][ny] == 0:
        arr[nx][ny] = arr[x][y] + 1
        queue.append((nx,ny))

bfs()

check = 0

for i in range(m):#전체를 탐색하면서 0이 있으면 check 
  if 0 in arr[i]:
    check +=1
    break
  else:
    cnt = max(cnt,max(arr[i])) #없으면 cnt에 max value 삽입

if check == 0:
  print(cnt-1)
else: print(-1)

 

3. 메모

열어분 저 처음으로 골드문제 해결했어요👻

댓글