[백준] 2573 파이썬 - 빙산

빙산 문제 링크

from collections import deque
import sys

input = sys.stdin.readline

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs():
  while queue:
    x,y = queue.popleft()

    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]

      if 0<=nx<n and 0<=ny<m:
        if visited[nx][ny] == 0 and data[nx][ny] == 0:
          data[x][y] -= 1
          if data[x][y] <= 0:
            data[x][y] = 0

def check(x,y):    # 빙산이 두개 이상으로 나눠지는지 여부를 확인하는 함수
  queue.append((x,y))
  visited[x][y] = 2    # 전달받은 좌표의 visited값을 2로 한다.

  while queue:
    x,y = queue.popleft()

    for i in range(4):
      nx = x + dx[i]
      ny = y + dy[i]
      if 0<=nx<n and 0<=ny<m:
        if visited[nx][ny] == 1:    # 이어져 있는 빙산이라면, 
          visited[nx][ny] = 2    # 2로 만들고, 큐에 추가한다
          queue.append((nx,ny))
  

n,m = map(int, input().split())
data = []
can_loop = True
t = 0
for _ in range(n):
  data.append(list(map(int,input().split())))


queue = deque()

while can_loop:
  cnt = 0
  visited =[[0]*m for _ in range(n)]
  can_loop = False
  for i in range(n):
    for j in range(m):
      if data[i][j] != 0:    # 빙산이 다 녹지 않았다면, 반복할 수 있으니 True로 설정
        visited[i][j] = 1
        can_loop = True

  for i in range(n):
    for j in range(m):
      if visited[i][j] == 1:    # 빙산이 하나로 이어져 있다면, check() 함수는 한 번만 실행될 것이다.
        check(i,j)
        cnt += 1
  
  if cnt >= 2:    # check() 함수가 두번 이상 호출된 경우(즉, 빙산이 두개 이상으로 나뉘어져 있는 경우)
    print(t)    # 시간을 출력하고 반복문을 벗어난다.
    break
  else:
    for i in range(n):
      for j in range(m):
        if data[i][j] != 0:
          queue.append((i,j))    
  t+= 1    
  bfs()      

if can_loop == False:    # 얼음이 다 녹을 때까지 빙산이 2개 이상으로 나뉘어지지 않았을 경우, 0을 출력한다
  print(0)

히히 실버 1로 승급했다

좋은 웹페이지 즐겨찾기