728x90
이 문제는 어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산하는 문제이다. 여기서 안전한 영역이란 강수량보다 해당 지역의 높이가 더 높아 물에 잠기지 않는 지점들의 집합 중 지점들끼리 서로 인접한 최대 영역을 말한다.
우선 특정 강수량이 주어진 경우를 생각해보자. 그러면 그 강수량에 대한 안전한 영역의 개수를 구하는 문제는 이전의 섬의 개수 문제와 거의 동일하다. 단지 안전한 영역을 찾기 위해 강수량보다 지점의 높이가 더 높은 지점에 대해서만 그래프 탐색을 한다는 점만 다를 뿐이다.
하지만 이 문제에서 원하는 값은 모든 강수량에 대한 안전한 영역의 최대 개수이므로, 강수량이 0일 때부터 해당 지역 중 가장 높은 지점의 높이일 때까지의 모든 경우를 고려해 영역의 개수를 센 뒤, 그 중 가장 큰 값을 고르면 될 것이다.
이를 코드로 구현하면 다음과 같다.
import sys
sys.setrecursionlimit(10**5)
def DFS(x, y):
global h, N
if visited[x][y]: return
visited[x][y] = True
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for i in range(4):
next_x = x + dx[i]
next_y = y + dy[i]
# 강수량보다 더 높은 지점에 대해 DFS를 재귀적으로 호출한다.
if 0<=next_x<N and 0<=next_y<N and m[next_x][next_y] > h:
DFS(next_x, next_y)
N = int(input())
m = []
for _ in range(N):
m.append(list(map(int, input().split())))
# 해당 지역에서 가장 높은 지점의 높이를 찾는다.
max_height = 0
for i in range(N):
max_height = max(max_height, max(m[i]))
# 모든 가능한 강수량에 대해 가장 많은 안전한 영역의 개수를 저장하는 변수
max_cnt = 0
# 모든 가능한 강수량에 대해 안전한 영역의 개수를 구한다.
for h in range(max_height):
visited = [[False]*N for _ in range(N)]
cnt = 0
for i in range(N):
for j in range(N):
if not visited[i][j] and m[i][j] > h:
DFS(i, j)
cnt += 1
max_cnt = max(max_cnt, cnt)
print(max_cnt)
728x90
'알고리즘 문제' 카테고리의 다른 글
백준 2583번 : 영역 구하기 in Python (0) | 2021.06.25 |
---|---|
백준 1987번 : 알파벳 in Python (0) | 2021.06.22 |
백준 11403번 : 경로 찾기 in Python (0) | 2021.06.22 |
백준 4963번 : 섬의 개수 in Python (0) | 2021.06.22 |
백준 9084번 : 동전 in Python (0) | 2021.06.20 |