1 분 소요

Problem

https://www.acmicpc.net/problem/1113

Idea

수영장의 높이가 1 이상 9 미만이므로 1~8까지 루프문을 돌려 각 높이에 해당되는 요소를 찾을 때마다 해당 면적을 bfs로 계산했다. 탐색 시에 범위가 리스트를 벗어날 경우 물이 고일 수 없는 것으로 간주하여 총 면적에 포함하지 않았다. 탐색 이후 방문한 요소마다 1을 더해 높이 1만큼 물이 차 있는 상황으로 만들어 다음 높이의 면적 계산에도 포함될 수 있도록 했다.

Code

import sys
from collections import deque

def bfs(y, x, lvl):
    mount = 0
    flag = True
    queue = deque()
    map[y][x] = lvl+1   # 해당 레벨 방문 처리
    queue.append((y, x))

    while queue:
        py, px = queue.popleft()
        mount += 1

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

            if ny < 0 or ny >= N or nx < 0 or nx >= M: 
            # 수영장 외곽과 닿으면 flag=False로 하여 총량에 추가하지 않음.
                flag = False
            elif map[ny][nx] == lvl:
                queue.append((ny, nx))
                map[ny][nx] = lvl+1

    if flag == True:
        return mount
    else:
        return 0

input = sys.stdin.readline

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

sum = 0
dy = [-1, 1, 0, 0]
dx = [0, 0, -1, 1]
for w in range(1, 9):
    for i in range(N):
        for j in range(M):
            if map[i][j] == w:
                sum += bfs(i, j, w)

print(sum)

Comment

태그: ,

카테고리:

업데이트: