💻 입력 조건
💻 출력 조건
💻 입력 예시1
7 7 2 0 0 0 1 1 0 0 0 1 0 1 2 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0
💻 출력 예시1
27
💻 입력 예시2
4 6 0 0 0 0 0 0 1 0 0 0 0 2 1 1 1 0 0 2 0 0 0 0 0 2
💻 출력 예시2
9
💻 입력 예시3
8 8 2 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
💻 출력 예시3
3
📖 문제 해결
itertools 내의 combination 모듈을 이용하여 가능한 1의 좌표들의 조합을 모두 구한 후, 각 경우들에 대하여 바이러스를 최대한 퍼뜨린 후 남아있는 0의 개수를 세는 방식으로 코드를 작성하였습니다. 이때 '바이러스를 최대한 퍼뜨리는 함수'를 bfs 알고리즘을 이용하여 작성하였습니다.
# n과 m의 값 입력 받기
n, m = list(map(int,input().split()))
# 지도의 모양 입력 받기
input_map = []
for i in range(n):
input_map.append(list(map(int,input().split())))
# 0의 좌표들을 입력 받기
coordinates = []
for r_idx, row in enumerate(input_map):
for c_idx, col in enumerate(input_map):
if input_map[r_idx][c_idx] == 0:
coordinates.append((r_idx,c_idx))
# 가능한 1의 좌표들의 조합 계산하기
from itertools import combinations
comb_coordinates = list(combinations(coordinates, 3))
from collections import deque
dx = [0,0,+1,-1]
dy = [+1,-1,0,0]
# 바이러스 전염 함수 만들기
def virus(input_map):
queue = deque()
count = 0
for r_idx, row in enumerate(input_map):
for c_idx, col in enumerate(input_map):
if input_map[r_idx][c_idx] == 2:
queue.append((r_idx,c_idx))
while queue:
virus_coordinate = queue.popleft()
for i in range(4):
minimum_ = 0 <= virus_coordinate[0]+dx[i] and 0 <= virus_coordinate[1]+dy[i]
maximum_ = virus_coordinate[0]+dx[i] < n and virus_coordinate[1]+dy[i] < m
if minimum_ and maximum_ and input_map[virus_coordinate[0]+dx[i]][virus_coordinate[1]+dy[i]] == 0 :
input_map[virus_coordinate[0]+dx[i]][virus_coordinate[1]+dy[i]] = 2
queue.append((virus_coordinate[0]+dx[i],virus_coordinate[1]+dy[i]))
for r_idx, row in enumerate(input_map):
for c_idx, col in enumerate(input_map):
if input_map[r_idx][c_idx] == 0:
count += 1
return count
import copy
safety_zone = []
for comb_coordinate in comb_coordinates:
input_map_copy = copy.deepcopy(input_map)
# 조합의 한 가지 경우의 수에 대하여 계산해보기 시작
for coordinate in comb_coordinate:
# print(coordinate)
input_map_copy[coordinate[0]][coordinate[1]] = 1
# 이 경우에 대하여 바이러스가 퍼진 이후 계산 및 0 개수 세기
safety_zone.append(virus(input_map_copy))
print(max(safety_zone))