코딩테스트

BFS&DFS_심화16) 연구소 _ python

728x90

문제 링크

https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

코드

from itertools import combinations
from collections import deque
import copy

n, m = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))


virus = [] # 바이러스의 좌표
empty = [] # 비어있는 0 좌표
for i in range(n):
    for j in range(m):
        if graph[i][j] == 2:
            virus.append([i,j])
        elif graph[i][j] == 0:
            empty.append([i,j])

dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]

def bfs(graph, x, y):
    que = deque()
    que.append((x,y))
    while que:
        x, y = que.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if graph[nx][ny] == 0:
                    graph[nx][ny] = 2
                    que.append((nx, ny))

result = 0
for walls in combinations(empty, 3):
    cnt = 0
    copy_graph = copy.deepcopy(graph)
    for x, y in walls: # 벽 세우기
        copy_graph[x][y] = 1
    for x, y in virus: # 바이러스 퍼트리기
        bfs(copy_graph, x, y)
    for row in range(n):
        cnt += copy_graph[row].count(0)
    result = max(result, cnt)
print(result)
728x90