문제
https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
문제 요약
지역의 높이 정보를 가진 크기가 N × N 배열을 입력 받는다.
비의 양에 때라 일정 높이 이하의 모든 지점은 물에 잠긴다.
첫째 줄에 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 출력한다.
+ 안전한 영역은 물에 잠기지 않는 지점들이 위, 아래, 오른쪽, 왼쪽으로 인접해 있으며 그 크기가 최대인 영역이다.
코드
from collections import deque
def bfs(i, j, h):
check[i][j] = cnt
q.append((i, j))
while q:
i, j = q.popleft()
for d in range(4):
ni = i + di[d]
nj = j + dj[d]
if 0 <= ni < N and 0 <= nj < N and check[ni][nj] == 0 and arr[ni][nj] > h:
# ni, nj가 배열 밖을 벗어나지 않고, 방문하지 않았고 안전한 영역이라면
check[ni][nj] = cnt
q.append((ni, nj))
N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
# 높이 정보를 저장한 2차원 배열
check = [[0] * N for _ in range(N)]
# 탐색을 했는 체크하는 부분
big = 0 # 가장 높은 높이
for i in range(N):
if big <= max(arr[i]):
big = max(arr[i])
res = -1 # 물에 잠기지 않는 안전한 영역의 최대 개수
di = [0, 0, 1, -1]
dj = [1, -1, 0, 0]
q = deque()
for h in range(big): # h는 물이 차는 높이
cnt = 1 # 구역 개수
for x in range(N):
for y in range(N):
if check[x][y] == 0 and arr[x][y] > h:
bfs(x, y, h)
cnt += 1
if cnt - 1 > res:
res = cnt - 1
check = [[0] * N for _ in range(N)] # check 배열 초기화
if res == -1:
print(0)
else:
print(res)
코드 설명
1. 높이 정보를 저장한 N × N 2차원 배열을 입력 받는다.
2. BFS 탐색 시 이전에 방문했는지를 체크하는 N × N 2차원 배열 check를 생성한다.
+ 초기값은 0 (방문 X)
3. 물이 0부터 가장 높은 높이까지 차오를 동안 bfs함수를 통해 BFS 탐색을 진행한다.
4. 탐색이 끝날 때마다 안전한 영역의 수 cnt와 이전의 res를 비교하여 갱신한다.
+ check배열의 모든 값을 다시 0으로 초기화
5. 반복문이 종료되면 res를 출력한다. (res가 -1, 구역의 수가 0일 때 예외 처리)
'Algorithm Problems > 그래프' 카테고리의 다른 글
[Python/백준] 1991번: 트리 순회 (2) | 2023.09.08 |
---|---|
[백준/Python] 2667번: 단지번호붙이기 (2) | 2023.09.01 |
[백준/Python] 1260번: DFS와 BFS (2) | 2023.08.28 |
[백준/python] 13023번: ABCDE (0) | 2023.08.27 |
[백준/python] 2644번: 촌수계산 (0) | 2023.08.25 |