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

 

 

 

안전 영역이 나누어진 영역의 최댓값이라니 이런 무능한 재난청이 다 있나 싶었지만 어쨌든 문제를 풀었다.

문제를 풀 때 주의하거나 유의하면 좋을 점들은 다음과 같다.

 

1. 강수량 범위를 정해서 시작할 것

2. 전체 지역을 처음부터 검사하고 visited 배열을 만들어서 방문 체크를 하되 강수량 별로 초기화 할 것

3. dfs를 시작하는 지점도 visited 체크하는 것을 잊지 말 것

4. 각각의 안전한 지역 수를 셀 필요는 없음

 

import sys


# 비의 양(rain)에 따라 안전지대 수를 계산
def dfs(rain, row, col, check):
    stack = [[row, col]]

    while stack:
        r, c = stack.pop()
        for nR, nC in [[r+1, c], [r-1, c], [r, c+1], [r, c-1]]:
            if 0 <= nR < n and 0 <= nC < n:
                if not check[nR][nC]:
                    if board[nR][nC] > rain:
                        stack.append([nR, nC])
                check[nR][nC] = 1


if __name__ == '__main__':
    n = int(sys.stdin.readline())
    board = []
    maxRain = 0  # max height
    # 최대 높이를 구하고 그것을 강수량 범위로 정한다
    for _ in range(n):
        tmp = list(map(int, sys.stdin.readline().split()))
        maxRain = max(maxRain, max(tmp))
        board.append(tmp)

    maxSafe = 0
    for rain in range(maxRain):
        safeZone = 0
        visited = [[0 for _ in range(n)] for _ in range(n)]  # 강수량 별로 초기화
        for i in range(n):
            for j in range(n):
                if not visited[i][j] and board[i][j] > rain:  # 침수 아닌 지역부터 시작
                    visited[i][j] = 1  # dfs를 시작하는 지점도 방문 체크를 잊지 말 것
                    dfs(rain, i, j, visited)
                    safeZone += 1
        maxSafe = max(maxSafe, safeZone)

    print(maxSafe)

'알고리즘 > BFS와 DFS' 카테고리의 다른 글

2178번. 미로 탐색  (0) 2020.04.08
13460번. 구슬 탈출 2  (0) 2019.12.31
11724번. 연결 요소의 개수  (0) 2019.12.24
14502번. 연구소  (0) 2019.12.20
11403번. 경로 찾기  (0) 2019.12.19

+ Recent posts