본문 바로가기
개발 노트/알고리즘 문제

백준 14502 연구소(골드 4)

by LeeInGyu 2025. 4. 13.

백준 14502 연구소(골드 4)

링크: 14502 연구소


접근 방법

  • 3개의 벽 세우기, 전염, 최종 개수 세기 반복
  • bfs 또는 dfs로 완전 탐색
  • 완전 탐색 근거: 시간 제한 2초, M의 최대값이 낮게 정해져 있음

소스 코드

소스 코드: 93042857 제출

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

input = sys.stdin.readline

# 입력
N, M = map(int, input().split())

# 리스트 선언
common_graph = []       # 공통으로 사용될 그래프
common_virus_list = []  # 공통으로 사용될 초기 바이러스 위치
empty_list = []         # 빈 공간(벽 세울 공간)
for n in range(N):
    ms = [int(i) for i in input().split()]
    for idx, m in enumerate(ms):
        coordinate = (n, idx)
        if m == 2:
            common_virus_list.append(coordinate)
        elif m == 0:
            empty_list.append(coordinate)

    common_graph.append(ms)

# 이동 가능 방법 4가지(상하좌우)
delta_n_list = [-1, 1, 0, 0]
delta_m_list = [0, 0, -1, 1]

# 세울 수 있는 벽의 조합을 계산
combinations_list = combinations(empty_list, 3)

max_count = 0
for combine in combinations_list:
    queue = deque(common_virus_list)    # 초기 바이러스 가져오기

    graph = deepcopy(common_graph)      # 초기 그래프 상태 가져오기
    for n, m in list(combine):
        graph[n][m] = 1

    while len(queue) > 0:
        n, m = queue.popleft()  # bfs
        for idx in range(4):
            new_n = n + delta_n_list[idx]
            new_m = m + delta_m_list[idx]
            if 0 <= new_n < N and 0 <= new_m < M:
                if graph[new_n][new_m] == 0: # 빈땅이면
                    graph[new_n][new_m] = 2  # 감염
                    queue.append((new_n, new_m))

    # 0의 개수 세기
    count = 0
    for mline in graph:
        count += mline.count(0)

    max_count = max(count, max_count)

# 최대 0 개수 반환
print(max_count)

코드 개선 사항

1. iterable 한 객체의 list 변환

for n, m in list(combine):
for n, m in combine:

2. 0의 개수 세기 간단하게 변경

# 0의 개수 세기
count = 0
for mline in graph:
    count += mline.count(0)
count = sum(row.count(0) for row in graph)

(선택) 3. 때에 따라서 캄프리헨스로 깊은 복사

graph = [row[:] for row in common_graph]
  • 2차원 이상일 경우 문제가 발생할 수 있어 선택적으로 사용한다.
  • deepcopy는 리스트 캄프리헨스보다 간단하다.

결론

  • 문제를 읽고 완전 탐색을 구분하는 능력을 익히는 중인데, 이번엔 내 예상이 적중해서 기쁘다 ㅎ
  • 리스트 캄프리헨스로 깊은 복사가 가능한 사실을 처음 알았다.
728x90
반응형

'개발 노트 > 알고리즘 문제' 카테고리의 다른 글

14889 스타트와 링크 (실버 1)  (0) 2025.04.17
백준 1753 최단경로(골드 4)  (0) 2025.04.15
백준 10844 쉬운 계단 수  (0) 2025.04.09
백준 9663 N-Queen  (0) 2025.04.08
백준 2485 가로수  (0) 2025.04.04