백준2468(파이썬) - 안전영역

resilient

·

2021. 5. 23. 23:37

728x90
반응형

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

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

  • 이 문제는 일단 DFS 형식을 똑같이 사용하지만, graph[x][y]가 0또는 1로 dfs재귀를 돌지 말지 정하는 것이 아니라 주어지는 높이에 따라서 높이인덱스에 맞게 각각 영역의 카운트가 들어가야한다.
  • 그래서 주어지는 높이를 dfs함수를 실행할 때 넣어서 함수를 실행한다.
  • 그리고 3중 for문을 이용하여 첫 번째 for문에는 높이를 0부터 graph안에 있는 최대 높이까지 돌려주면서 
  • x,y 2차원 배열을 dfs 실행 시켜주고, 첫 번째 for문이 끝날 때마다 카운트랑 비교해주면서 최대값을 갱신해주면 된다.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)

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

def dfs(x,y,h):
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if -1<nx<n and -1<ny<n and visited[nx][ny] == 0 and graph[nx][ny]>h:
            visited[nx][ny] = 1
            dfs(nx,ny,h)

n = int(input())
graph = []
for i in range(n):
    graph.append(list(map(int,input().split())))

high = 0
for i in range(len(graph)):
    for j in graph[i]:
        if j > high:
            high = j

num = 1
for i in range(high):
    visited = [[0]*n for _ in range(n)]
    cnt = 0
    for j in range(n):
        for k in range(n):
            if graph[j][k] > i and visited[j][k] == 0:
                cnt += 1
                visited[j][k] = 1
                dfs(j,k,i)
    num = max(num,cnt)

print(num)
반응형