2468. 안전영역
2024. 4. 18. 19:56ㆍProgrammers
728x90
그저 최소(최대)만 보면 BFS로 눈돌아가는 나..(언제 정신차릴래)ㅜ
from collections import deque
n = int(input())
graph = [list(map(int, input().split())) for _ in range(n)]
# max 값 찾기(O(n))
max_value = 0
for i in range(len(graph)):
a = max(graph[i])
if a > max_value:
max_value = a
q = deque([(0,0)])
i = 0
count = 1
# 1씩 줄여나가면서 안전 영역 개수 찾기 by BFS
while q:
x, y = q.popleft()
value = max_value - i
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if ((graph[nx][ny] == graph[x][y]) or
(graph[nx][ny] <= value) or
(nx < 0 or nx >= n or ny < 0 or ny >= n)):
continue
if ((graph[nx][ny] > value) and )
여기서 풀다가 정신이 나가버렸다..
안전구역의 영역을 확인 후에 count+1를 해줘야 하기 때문에, BFS가 아닌 DFS로 접근을 해야 풀이가 수월하다.
1. 움직임의 최소단위
2. 안전영역 = 움직임의 최소 단위로 움직이다 자기 자신이 온 1칸을 제외 3면이 막혀있다면 끝, 안전영역 생성
3. 인덱스 밖을 벗어나면 종료
4. 한쪽 방향으로 뻗어나간 움직임을 감지해야 하므로 DFS로 접근을 해야 함.
import sys
sys.setrecursionlimit(100000)
# 상, 하, 좌, 우
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# Recursive한 DFS 함수 선언
def dfs(x, y, h):
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
# 안전영역에 포함되는 조건
if (0 <= nx < n) and (0 <= ny < n) and not sink_graph[nx][ny] and graph[nx][ny] > h:
sink_graph[nx][ny] = True
dfs(nx, ny, h)
n = int(sys.stdin.readline())
graph = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
ans = 1
# 완전 탐색으로 DFS 실행
for k in range(max(map(max, graph))): # 1~최댓값 비교
sink_graph = [[False]*n for _ in range(n)] # boolean 배열 생성
count = 0
for i in range(n):
for j in range(n):
if graph[i][j] > k and not sink_graph[i][j]:
count += 1
sink_graph[i][j] = True
dfs(i,j,k)
ans = max(ans, count)
print(ans)
728x90
'Programmers' 카테고리의 다른 글
14503. 로봇 청소기 (0) | 2024.04.21 |
---|---|
9205.맥주 마시면서 걸어가기 (0) | 2024.04.20 |
[2644]촌수 계산 (0) | 2024.04.10 |
[SQL] 노선별 평균 역 사이 거리 조회하기 (0) | 2024.03.10 |
[Leet Code] Best time to Buy and Sell Stock II (0) | 2024.02.09 |