본문 바로가기

알고리즘

[baekjoon] 14502. 연구소


로직

 벽이 추가로 세워질 수 있는 곳에 벽을 세우면서 진행한다. 세울 때마다 기존의 board판에 추가해야하며, 세우고나서 바이러스들이 이동한다. 바이러스 이동하는 것을 move라는 함수를 만들어 매번 사용한다.

 이때, 안전한 공간 갯수는 처음에 0인 값들을 cnt에 다 넣고, 벽이 3개가 추가되니까 cnt - 3하고, 바이러스가 이동한 공간의 갯수를 빼준다(바이러스 이동 공간갯수는 move함수에서 return한다.)

 

코드

from collections import deque
from itertools import combinations
from copy import deepcopy

N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]


can_wall = []
# virus = deque([])
virus = []
cnt = 0
for i in range(N):
    for j in range(M):
        if board[i][j] == 0:
            can_wall.append([i, j])
            cnt += 1
        elif board[i][j] == 2:
            virus.append([i, j])

def move(virus):
    answer = 0
    virus = virus[:]
    near = [(-1, 0), (0, 1), (1, 0), (0, -1)]

    while virus:
        # x, y = virus.popleft()
        x, y = virus.pop(0)

        for a, b in near:
            xi, yi = x + a, y + b
            if 0 <= xi < N and 0 <= yi < M:
                if bd[xi][yi] == 0:
                    virus.append([xi, yi])
                    answer += 1
                    bd[xi][yi] = 2

    return answer

walls = list(combinations(can_wall, 3))

mymax = 0
for i in walls:
    bd = deepcopy(board)
    for j in range(3):
        a = i[j][0]
        b = i[j][1]
        bd[a][b] = 1
    result = cnt - 3 - move(virus)

    if mymax < result:
        mymax = result

print(mymax)

 

주의할 점

1. virus = virus[:] 이 줄 필수!! why? 함수 돌릴 때마다 바이러스가 있는거를 써야하니까 새로운 virus가 필요함

   -> 처음 값 복사 필요

 

2. virus = virus[:] 하고 while돌면서 virus를 pop해야하는데,

     1) deque하면 TypeError: sequence index must be integer, not 'slice'

     2) 그냥 []하고 pop하면 돌아간다

 

 

'알고리즘' 카테고리의 다른 글

[baekjoon] 13458. 시험감독  (0) 2020.08.18
[baekjoon] 14500. 테트로미노  (0) 2020.08.16
[programmers] 보석쇼핑  (0) 2020.08.13
[baekjoon] 3190. 뱀  (0) 2020.08.12
[programmers] 카카오프렌즈 컬러링북  (0) 2020.08.11