[Python] 백준 2573 빙산 풀이

지민·2022년 8월 6일
0
post-thumbnail
# PROBLEM - 빙산
# TIER - G4
# NUMBER - 2573
# DATE - 2022-08-05 23:44
# IDEA - 이건 2덩이인지 판별 함수, 상하좌우 0개수 카운팅 함수 2개 만들어서
# BFS 하면 될듯
import sys
import collections
import copy
input = sys.stdin.readline

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

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

flag = 0
year = 0


def counting(nowX, nowY): # 주면 상하좌우의 0개수에 따라 녹일 개수 return
    count = 0
    for i in range(4):
        nx, ny = nowX+dx[i], nowY+dy[i]
        if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] == 0:
            count += 1
    return count


def melt(): # counting 함수로 녹인 graph return
    global graph
    glacier = copy.deepcopy(graph)
    for i in range(N):
        for j in range(M):
            if graph[i][j] != 0:
                glacier[i][j] -= counting(i, j)
                if glacier[i][j] < 0:
                    glacier[i][j] = 0
    graph = glacier


def check(): # while문 계속 돌리면서 녹일지 return
    global flag
    answer = []
    gray_scale = copy.deepcopy(graph)

    for i in range(N):
        for j in range(M):
            if gray_scale[i][j] != 0:
                gray_scale[i][j] = 1

    for i in range(N):
        for j in range(M):
            if gray_scale[i][j] == 1:
                bfs(gray_scale, i, j)  # 0, 1로만 이루어진 gray_scale 생성
                answer.append('엄준식') # 조각 개수만큼 answer에 엄준식 추가
    if len(answer) == 1: # 한조각이라면 -> 계속하기
        return True
    elif len(answer) == 0: # 동시에 녹는다면? -> flag 들어주기
        flag = 1
        return False # 반복 종료
    else: 
        return False # 여러조각으로 쪼개진다면 -> 반복 종료 


def bfs(gray_scale, startX, startY): # 몇조각인지 return
    queue = collections.deque([(startX, startY)]) # 0, 1 로만 이루어진 gray_scale 배열로 조각 개수 구함
    gray_scale[startX][startY] = 0
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx, ny = x+dx[i], y+dy[i]
            if 0 <= nx < N and 0 <= ny < M and gray_scale[nx][ny] == 1:
                gray_scale[nx][ny] = 0
                queue.append((nx, ny))

while check(): # check 함수로 조각 개수 구해가면서 
    melt() # 녹이기
    year += 1 # 년수 추가

print([year, 0][flag]) # 만약 동시에 녹으면 flag = 1 만들어서 0 출력

빡구현때매 스트레스받아요

profile
남들 개발 공부할 때 일기 쓰는 사람

0개의 댓글