파이썬
[백준 파이썬] 14502번 연구소
운으로
2022. 6. 20. 17:29
https://www.acmicpc.net/problem/14502
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
from collections import deque
import copy
from sys import stdin
N, M = map(int, stdin.readline().split())
arr = [list(map(int, stdin.readline().split())) for _ in range(N)]
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
result = 0
def bfs():
global result
deq = deque()
temp = copy.deepcopy(arr)
for i in range(N):
for j in range(M):
if temp[i][j] == 2:
deq.append((i,j))
while deq:
r, c = deq.popleft()
for d in range(4):
nr = r + dr[d]
nc = c + dc[d]
if 0 <= nr < N and 0 <= nc < M and temp[nr][nc] == 0:
temp[nr][nc] = 2
deq.append((nr, nc))
# 0 개수 세아리기
tmp = 0
for i in range(N):
for j in range(M):
if temp[i][j] == 0:
tmp += 1
result = max(result, tmp)
# 벽 3개 만들기
def wall(cnt):
if cnt == 3:
bfs()
return
for i in range(N):
for j in range(M):
if arr[i][j] == 0:
arr[i][j] = 1
cnt += 1
wall(cnt)
cnt -=1
arr[i][j] = 0
wall(0)
print(result)
<풀이방법>
bfs문제로 벽 3개 만드는 부분이 포인트였다. 벽 3개를 만들 수 있는 모든 경우의 수를 반복하여 최대값을 구해야한다.
<리뷰>
아직 재귀부분이 좀 약한 거 같아서 연습을 많이 해야겠다.