728x90
from collections import deque
from itertools import combinations
import copy

N,M = map(int,input().split())
block = []
empty = []
virus = []
for i in range (0,N):
    A = list(map(int,input().split()))
    for j in range (0,M):
        if A[j] == 0:
            empty.append([i,j])
        if A[j] == 2:
            virus.append([i,j])
    block.append(A)
ans = 0
for x in combinations(empty,3):
    cnt = 0
    x = list(x)
    B = copy.deepcopy(block)
    B[x[0][0]][x[0][1]],B[x[1][0]][x[1][1]], B[x[2][0]][x[2][1]]  = 1,1,1
    dx,dy = [0,0,-1,1],[1,-1,0,0]
    deq = deque()
    for i in range (0,len(virus)):
        deq.appendleft(virus[i])
    while deq:
        y = deq.popleft()
        for i in range (0,4):
            z = y[0] + dx[i]
            w = y[1] + dy[i]
            if 0 <= z < N and 0 <= w < M and B[z][w] == 0:
                B[z][w] = 2
                deq.append([z,w])
    for i in range (0,N):
        for j in range (0,M):
            if B[i][j] == 0:
                cnt += 1
    ans = max(ans,cnt)
print(ans)

 

생각보다 클린코드가 나와서 좋았던 것 같습니다. 

 

바이러스가 옮겨질 조건은, 아무것도 없는 0인 공간에 한하므로, B[z][w]에서 적절하게 이용하면 좋을 것 같습니다.

결국 벽 3개라는 조건이 주어졌으므로, 브루트포스를 통해서 문제를 해결할 수 있었습니다.

 

문제를 살짝 응용한다면, 벽 하나를 세우는데 cost가 들 때, 최적의 cost - safety area를 컨트롤 하는 방법도 있겠습니다.

오히려 이쪽이 더 재밌을 것 같은 느낌이네요. 대신 이렇게 된다면 난이도는 조금 더 올라갈지도 ... ? 

 

(벽 갯수를 다시 제한하는 방식 등등으로...)

'코딩' 카테고리의 다른 글

[BOJ] 2252 줄 세우기 Python  (0) 2024.02.28
[BOJ] 1132 합 (Python)  (1) 2024.02.27
[BOJ] 1158 요세푸스 수열  (1) 2024.02.09
[BOJ] 28449 누가 이길까  (1) 2024.02.07
[BOJ] 1503 세 수 고르기 Python  (0) 2024.01.10

+ Recent posts