PS/백준

[Python] 14502번 연구소

s_omi 2024. 10. 30. 09:40

✏️ 문제

 

문제 파악

바이러스가 벽을 제외하고 네 방향으로 퍼질 수 있으므로 bfs를 사용했다. 

그리고 비어있는 영역 중에 3개의 영역에 벽을 세울 수 있으므로 combinations을 사용해야 한다.

for .. in combinations(가능한 위치 배열, 개수)

 

벽을 세운 후에 남아있는 영역 중 안전 영역의 개수를 구해야 하므로 dfs를 돈 결과가 필요하다.

그래서 연구소 배열을 deepcopy를 통해 여러 개의 연구소 배열을 만들고 여러 연구소 배열의 안전 영역의 개수 중 제일 많은 영역을 출력하도록 max를 사용해 코드를 짰다.

 

 

알고리즘

  • 구현
  • 그래프 이론
  • 브루트포스 알고리즘
  • 그래프 탐색
  • 너비 우선 탐색

 

코드

import sys
import copy
from collections import deque
from itertools import combinations

n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
d = [(1, 0), (0, 1), (-1, 0), (0, -1)]
empty = []
virus = []
max_count = 0

for i in range(n):
  for j in range(m):
    if graph[i][j] == 0:
      empty.append((i, j))
    if graph[i][j] == 2:
      virus.append((i, j))

def dfs(graph, virus):
  q = deque(virus)

  while q:
    x, y = q.popleft()

    for i in range(4):
      dx = x + d[i][0]
      dy = y + d[i][1]

      if 0 <= dx < n and 0 <= dy < m and graph[dx][dy] == 0:
        graph[dx][dy] = 2
        q.append((dx, dy))

def safe(graph):
  count = sum(row.count(0) for row in graph)
  return count

for walls in combinations(empty, 3):
  temp_graph = copy.deepcopy(graph)
  for x, y in walls:
    temp_graph[x][y] = 1

  dfs(temp_graph, virus)
  count = safe(temp_graph)
  max_count = max(count, max_count)

print(max_count)

 

 

 

 

'PS > 백준' 카테고리의 다른 글

[Python] 15686번 치킨 배달  (0) 2024.10.30
[Python] 1193번 분수찾기  (1) 2024.10.30
[Python] 1966번 프린터 큐  (0) 2024.10.30
[Python] 2193번 이친수  (1) 2024.09.15
[Python] 1904번 01타일, 자세한 설명, 그림 참조  (0) 2024.09.15