문제 링크 https://www.acmicpc.net/problem/24513
난이도 골드 3
문제 유형 그래프 이론, 그래프 탐색, 너비 우선 탐색
1. 바이러스 감염 위치 담을 q 생성 및 초기 위치 큐에 담기
2. 큐가 빌 때까지 확인
2-1. 이미 바이러스 3으로 감염되었을 경우 인접 마을 확인 x
2-2. 인접 마을 확인
2-2-1. 치료제가 있는 마을인 경우 제외
2-2-2. 감염 되지 않은 마을인 경우 감염 후 큐에 추가
2-2-3. 이미 감염되어 있는 마을인 경우 감염 거리 같은 경우인지 확인
3. 바이러스 감염 수 카운트
import sys
input = sys.stdin.readline
from collections import deque
N, M = map(int, input().split())
town = [list(map(int, input().split())) for _ in range(N)]
visited = [[0]*M for _ in range(N)]
answer = [0]*4
# 1. 바이러스 감염 위치 담을 q 생성 및 초기 위치 큐에 담기
q = deque()
for i in range(N):
for j in range(M):
# 바이러스가 있으면 큐에 담기
if town[i][j] > 0:
q.append((town[i][j], i, j))
# 2. 큐가 빌 때까지 확인
while q:
virus, y, x = q.popleft()
# 2-1. 이미 바이러스 3으로 감염되었을 경우 인접 마을 확인 x
if town[y][x] == 3:
continue
# 2-2. 인접 마을 확인
for iy, ix in ((-1, 0), (1, 0), (0, 1), (0, -1)):
dy = y + iy
dx = x + ix
if 0 <= dy < N and 0 <= dx < M:
if town[dy][dx] == -1: # 2-2-1. 치료제가 있는 마을인 경우 제외
continue
if town[dy][dx] == 0: # 2-2-2. 감염 되지 않은 마을인 경우 감염 후 큐에 추가
town[dy][dx] = virus
visited[dy][dx] = visited[y][x] + 1
q.append((virus, dy, dx))
# 2-2-3. 이미 감염되어 있는 마을인 경우 감염 거리 같은 경우인지 확인
elif town[dy][dx] != virus and visited[dy][dx] == visited[y][x] + 1:
town[dy][dx] = 3 # 3으로 감염되고 더이상 감염 퍼지지 않음
# 3. 바이러스 감염 수 카운트
for i in range(N):
for j in range(M):
if town[i][j] == -1:
continue
answer[town[i][j]] += 1
print(*answer[1:])