백준_BFS_안전영역_2468_파이썬

석준·2022년 8월 31일
0

백준_문제풀이

목록 보기
22/30
post-thumbnail

✅문제 요약

  1. nxn 지역이 있고 1x1칸에 지역별 높이가 정수로 담겨있다
  2. 장마철 비가 내릴 때 물에 잠기지 않는 영역이 가장 많을 때 몇개의 영역인지 출력하라

✅문제 풀이

지문 이해가 안됐던 문제
결론적으로 장마철 비가 1만큼 왔을 때 안정영역의 수, 2만큼 왔을 때, 3만큼 ...을 따지면서 순회해야한다.

따라서 각 비가 왔을 때마다 nxn격자를 탐색하며 잠기지 않은 지역을 발견하면
cnt += 1 해주면서 해당 영역을 탐색하고, 방문하지 않은 안전영역이 다시 발견되면
cnt += 1 해주며 반복작업을 해서 답을 도출했다

from collections import deque

n = int(input())
graph = []
maxNum = 0

for a in range(n):
    graph.append(list(map(int, input().split())))
    for b in range(n):
        if graph[a][b] > maxNum:
        	# 격자에서 가장 높은 지반을 찾고
            # 장마철 비가 해당 지반 이하만큼 왔을 때 탐색
            maxNum = graph[a][b]

direct = [(0, 1), (0, -1), (1, 0), (-1, 0)]
# 결과값
result = 0

# 물의 높이를 0부터 따지며 순회
# 케이스 중에 지반의 높이가 0인 지역이 있음
for value in range(maxNum):
    visit = [[0] * n for i in range(n)]
    cnt = 0
	
    # BFS
    for j in range(n):
        for k in range(n):
            if graph[j][k] > value and visit[j][k] == 0:
                Q = deque([(j, k)])
                visit[j][k] = 1

                while Q:
                    x, y = Q.popleft()

                    for d in direct:
                        nx, ny = x + d[0], y + d[1]
                        if 0 <= nx < n and 0 <= ny < n:
                            if graph[nx][ny] > value and visit[nx][ny] == 0:
                                visit[nx][ny] = 1
                                Q.append((nx, ny))
                # Q가 끝나면 안전영역 +1
                cnt += 1
	# 최대 영역 수 갱신
    if result < cnt:
        result = cnt

print(result)
profile
파이썬 서버 개발자 지망생

0개의 댓글