백준-2468-안전 영역
업데이트:
문제
풀이
문제조건 해석
장마철에 물에 잠기지 않는 안전 영역의 최댓값 구하기.
안전 영역은 물에 잠기지 않는 영역의 인접한 집합을 말한다.
물의 높이를 1~(건물 높이의 최댓값-1) 로 순회하면서 완전탐색하면 된다.
- 완탐만 하면 되므로 DFS / BFS 상관없다.
알고리즘
완전탐색은 BFS로 구현하였다.
안전 영역의 수는 visited 배열 이용해서 증가시켰다.
코드
from sys import stdin
from collections import deque
input = stdin.readline
n = int(input().rstrip())
arr = []
height = 0
for _ in range(n):
arr.append([int(x) for x in input().rstrip().split()])
height = max(arr[-1]) # 건물 높이의 최댓값
def bfs(i, j, level):
queue = deque([(i, j)])
while queue:
i, j = queue.pop()
for di, dj in ((0, -1), (-1, 0), (0, 1), (1, 0)):
if not (0 <= i+di < n and 0 <= j+dj < n):
continue
if arr[i+di][j+dj] > level and not visited[i+di][j+dj]:
visited[i+di][j+dj] = True
queue.append((i+di, j+dj))
answer = 1 # 아무데도 안잠기면 안전 영역의 수는 1
for level in range(1, height):
visited = [[False for _ in range(n)] for __ in range(n)]
safety = 0
for i in range(n):
for j in range(n):
if not visited[i][j] and arr[i][j] > level:
safety += 1
bfs(i, j, level)
answer = max(answer, safety)
print(answer)
배운점
- 항상 예외 상황 고려하기
- 완탐 문제는 꼭 BFS안써도 된다. 최솟값 구하는 문제나 탐색 깊이를 알아야 할 때는 BFS 써야 한다.
댓글남기기