[백준 2573] 빙산

Junyoung Park·2022년 5월 25일
0

코딩테스트

목록 보기
435/631
post-thumbnail

1. 문제 설명

빙산

2. 문제 분석

BFS를 통해 들어오는 위치에서 (현 시점의) 인접 물 개수를 카운트, 감산해주면서 연결된 모든 빙하를 녹이는 과정을 반복한다. 이때 중요한 것은 visited를 사용해 연결되어 있지 않은 빙하가 발견될 때 이를 곧바로 체크하는 점이다.

  • 메인에서 flag를 확인하니 여러 번 조건문을 사용해야 하는 번거로움이 있었다. 함수를 통해 사용했다면 return을 통해 간략하게 처리할 수 있었을 것 같다.

3. 나의 풀이

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().rstrip().split())
nodes = [[] for _ in range(n)]
for i in range(n): nodes[i] = list(map(int, sys.stdin.readline().rstrip().split()))

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

def BFS(row, col):
    queue = deque()
    queue.append([row, col])
    visited[row][col] = True
    # 입력받은 좌표를 시작점으로 카운트

    while queue:
        cur_row, cur_col = queue.popleft()

        num = 0
        for x, y in zip(dx, dy):
            next_row, next_col = cur_row + y, cur_col + x
            if next_row < 0 or next_col < 0 or next_row >= n or next_col >= m : continue

            if not visited[next_row][next_col] and nodes[next_row][next_col] == 0: num += 1
            # 방문한 적이 없는 (=빙하만 방문하고 있기 때문에, 현 방문으로 인해 '녹은' 곳은 카운트 X) 물 개수
            if not visited[next_row][next_col] and nodes[next_row][next_col] != 0:
                visited[next_row][next_col] = True
                queue.append([next_row, next_col])

        if nodes[cur_row][cur_col] - num <= 0:
            nodes[cur_row][cur_col] = 0
        else:
            nodes[cur_row][cur_col] -= num
        # 인접 0의 개수만큼 감산

day = 0
while True:
    visited = [[False for _ in range(m)] for _ in range(n)]
    # 방문 체크. BFS를 통해 확인할 빙하, 연결성 등을 고려하기 위해 매번 갱신
    flag = 0
    for i in range(n):
        for j in range(m):
            if not visited[i][j] and nodes[i][j] != 0:
                flag += 1
                if flag > 1: break
                # 모든 빙하(값이 0이 아닌 위치)가 연결되어 있어야 함
                BFS(i, j)
        if flag > 1: break

    if flag > 1: break
    elif flag == 0:
        # 분리되지 않고 녹았을 때 0으로 기록
        day = 0
        break
    # WHILE 루프를 돌 수 있는 조건은 flag == 1일 경우
    day += 1
print(day)
profile
JUST DO IT

0개의 댓글