구현을 처음풀때는 막막했지만 브루트포스에 대해 알고난 이후로 어렵게 느껴지지는 않는 문제.
이제는 왜 골드5인줄 알겠다.
벽을 어떻게 고를 것인가?
여유공간은 어떻게 산출할 것인가?
import sys
input = sys.stdin.readline
from itertools import combinations
from collections import deque
def bfs(walls):
q = deque()
visited = [[False]*M for _ in range(N)]
ret = 0
for wall in walls:
i, j = wall
lab[i][j] = 1
for v in virus:
x, y = v
q.append((x,y))
visited[x][y] = True
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < N and 0 <= ny < M and not visited[nx][ny] and not lab[nx][ny]:
visited[nx][ny] = True
q.append((nx,ny))
ret += 1
for wall in walls:
i, j = wall
lab[i][j] = 0
return ret
N, M = map(int, input().split())
lab = [list(map(int, input().split())) for _ in range(N)]
dx = [0,0,-1,1]
dy = [1,-1,0,0]
cnt = 0
virus = []
candidates = []
for i in range(N):
for j in range(M):
if not lab[i][j]:
candidates.append((i,j))
cnt += 1
elif lab[i][j]==2:
virus.append((i,j))
max_area = 0
wall_sets = combinations(candidates,3)
for wall_set in wall_sets:
max_area = max(cnt - bfs(wall_set)-3,max_area)
print(max_area)
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 17266 어두운 굴다리 (0) | 2021.09.19 |
---|---|
[백준][Python] 15683 감시 (0) | 2021.09.19 |
[백준][Python] 20056 마법사상어와 파이어볼 : BFS 구현 (0) | 2021.09.18 |
[백준][Python] 17073 나무 위의 빗물 (0) | 2021.09.17 |
[백준][Python] 16435 스네이크 버드 : 구현 (0) | 2021.09.17 |