알고리즘/백준

[백준] 17142 - 연구소 3 (파이썬)

소갱 2021. 9. 26. 20:07
from itertools import combinations
from collections import deque
n , m = map(int,input().split())
array = []
for _ in range(n):
    array.append(list(map(int,input().split())))
virus = []
for i in range(n):
    for j in range(n):
        if array[i][j] == 2:
            virus.append([i,j,0])
choice = deque(combinations(virus,m))
dx = [-1,0,1,0]
dy = [0,1,0,-1]

def check(visit):
    for i in range(n):
        for j in range(n):
            if visit[i][j] == False and array[i][j] == 0:
                return False
    return True
def BFS():
    k = 0
    visit = [[False for _ in range(n)] for _ in range(n)]
    
    while q:
        a = q.popleft()
        x = a[0]
        y = a[1]
        time = a[2]
        visit[x][y] = True
        for i in range(4):
            nx = x+dx[i]
            ny = y+dy[i]
            if 0<=nx<n and 0<=ny<n:
                if array[nx][ny] == 0 and visit[nx][ny] == False:
                    visit[nx][ny] = True
                    q.append((nx,ny,time+1))
                    k = max(k,time+1)
                elif array[nx][ny] == 2 and visit[nx][ny] == False:
                    q.append((nx,ny,time+1))
                    # 2는 남아도 괜찮아서 k값 비교하지 않음
    if check(visit):
        return k
    else:
        return 2505
total = 2505
for i in range(len(choice)):
    q = deque(choice[i])
    total = min(total,BFS())
if total == 2505:
    print(-1)
else:
    print(total)

total은 배열 최대크기가 2500이라서 넉넉하게 2505로 시작했다.

이 문제에서 비활성화 바이러스 다루는게 제일 관건이었다고 생각한다.

처음부터 모든 바이러스를 방문했다고 처리 할 경우 그쪽 방향으로 더 진행할 수 없기 때문에

k값 비교만 안하는 걸로 해결하였다.