🔻PS/Codetree

[Codetree] 빙하 Python

_니지 2024. 9. 2. 20:23

https://www.codetree.ai/missions/2/problems/glacier/description

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

import sys
from collections import deque

input = sys.stdin.readline


n, m = map(int, input().split(" "))

graph = []
queue = deque()

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


for _ in range(n):
    temp = list(map(int, input().split()))
    graph.append(temp)


### 구현부


def bfs(visited, start_x, start_y):
    # visited = [[0 for _ in range(m)] for _ in range(n)]
    
    queue.append((start_x, start_y))
    visited[start_x][start_y] = 1

    while queue:
        x, y = queue.popleft()
        visited[x][y] = 1
        # print(x, y)

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

            if 0<= nx and nx < n and 0<= ny and ny < m:
                if graph[nx][ny] == 0 and visited[nx][ny] == 0:
                    queue.append((nx, ny))
                    visited[nx][ny] = 1


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

        if visited[nx][ny] == 1:
            return True
    return False


def stop():
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:  
                return False
    return True



ice = []

while True:
    visited = [[0 for _ in range(m)] for _ in range(n)]

    # 녹일 위치의 바깥 체크
    bfs(visited, 0, 0)

    # 녹일 위치에서 녹일 수 있는지 확인
    cnt = 0

    for i in range(n):
        for j in range(m):
            if visited[i][j] == 0:
                if canMelt(visited, i, j):
                    graph[i][j] = 0
                    cnt += 1
    
    ice.append(cnt)

    if stop():
        print(len(ice), ice[-1])
        break
728x90
반응형