[백준] 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로 승급했다
Author And Source
이 문제에 관하여([백준] 2573 파이썬 - 빙산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hamkua/백준-2573-파이썬-빙산저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)