For Programmer

백준 14502번 파이썬 문제풀이(연구소) 본문

코팅테스트/백준 문제 모음

백준 14502번 파이썬 문제풀이(연구소)

유지광이 2022. 5. 27. 21:59
728x90

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

 

14502번: 연구소

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

www.acmicpc.net

 


 

간단히 0의  위치를 저장후 3개를 뽑는다 그 3개를 1로 바꾸고 바꾼상태에서 bfs를돌려 바이러스를 잠식하게 한다. 그 후 0의 개수를 세어 가장큰값을 찾으면 된다.

 

from collections import deque

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

brr = []
zero = []
two = []
max_ = 0

dr = [-1, 0, 1, 0]  # 행 상 우 하 좌
dc = [0, 1, 0, -1]  # 열 상 우 하 좌

# 0과 2의 위치 찾기
for i in range(N):
    for j in range(M):
        if not map_[i][j]:
            zero.append((i, j))
        elif map_[i][j] == 2:
            two.append((i, j))


# 바이러스가 퍼지는 위치를 확인하여 안전지대 개수 구한다
def bfs(dump_map):
    global max_

    visited = [[False] * M for _ in range(N)]
    queue = deque()
    for i in range(len(two)):
        queue.append(two[i])

    while queue:
        r, c = queue.popleft()

        for i in range(4):
            nr = r + dr[i]
            nc = c + dc[i]

            if nr < 0 or nr >= N or nc < 0 or nc >= M or visited[nr][nc] or dump_map[nr][nc]:
                continue

            dump_map[nr][nc] = 2
            visited[nr][nc] = True
            queue.append((nr, nc))

    cnt = 0
    for i in range(N):
        for j in range(M):
            if not dump_map[i][j]:
                cnt += 1

    if max_ < cnt:
        max_ = cnt


# 0의 위치에서 3개를 뽑은 후 벽으로 바꾸어준다.
def dfs(cur, start):
    if cur == 3:
        dump_map = []
        for i in range(N):
            dump_map.append(map_[i][:])

        for r, c in brr:
            dump_map[r][c] = 1

        bfs(dump_map)
        return

    for i in range(start, len(zero)):
        brr.append(zero[i])
        dfs(cur + 1, i + 1)
        brr.pop()


dfs(0, 0)
print(max_)
728x90
Comments