알고리즘 문제 풀이/백준

[좀비 바이러스/G3/Python3]

제유찬 2024. 11. 17. 18:30

24513번 좀비 바이러스 G3

 

문제
여기 N x M 격자 모양의 마을이 있다. 어느 날 세상에 좀비 바이러스가 창궐하여 바이러스가 빠르게 퍼져나가 버린다. 바이러스에 대해 조사한 결과 세 종류의 바이러스가 존재했으며 각각 1번, 2번, 3번으로 번호를 매겼다. 바이러스의 특징은 다음과 같다. 1번과 2번 바이러스는 치사율은 낮지만 전염성이 강해 상하좌우에 인접해 있는 마을로 동시에 퍼져나가며 한 마을을 완전히 감염시키는 데 1시간 걸린다.마을이 완전히 감염되어야 다른 마을로 퍼져나갈 수 있으며 다른 바이러스가 완전히 감염시킨 마을은 침범하지 않는다. 마을이 한 바이러스에 완전히 감염되기 전에 다른 종류의 바이러스가 마을에 도착하면 3번 바이러스가 만들어진다. 3번 바이러스는 치사율이 높은 만큼 전염성이 약해 감염된 마을에서 더 이상 퍼지지 않는다. 치료제를 갖고 있는 마을은 감염시킬 수 없다. 1번 바이러스와 2번 바이러스에 감염된 마을이 나와버렸다. 바이러스가 퍼질 수 있는 대로 퍼졌을 때 1번, 2번, 3번 바이러스에 감염된 마을이 각각 몇 개일지 구해보자.

입력
첫째 줄에 N(2≤N≤1000)과 M(2≤M≤1000)이 주어진다.
둘째 줄부터 N개의 줄에 걸쳐 마을의 상태가 M개 주어진다. 마을의 상태는 다음과 같이 이루어져 있다.
−1: 치료제를 가진 마을,  0: 아직 감염되지 않은 마을,  1: 1번 바이러스에 감염된 마을,   2: 2번 바이러스에 감염된 마을
1번 바이러스와 2번 바이러스에 감염된 마을은 각각 하나씩만 주어진다.

출력
1번, 2번, 3번 바이러스에 감염된 마을의 수를 공백으로 구분하여 한 줄에 출력한다.



 

일반적인 BFS로 감염시키는 문제와 달리 완전 감염이라는 개념이 포함되어 있다.

이 때문에 탐색 이전에 완전히 감염된 집의 경우 완전 감염 처리를 진행해야한다.

 

모든 탐색이 완료되면, 모든 마을을 확인하여 개수를 구한다.

 

더보기
import sys
from collections import deque

col, row = map(int, sys.stdin.readline().split())

maze = [list(map(int, sys.stdin.readline().split())) for _ in range(col)]
can_change = [[True] * row for _ in range(col)]
varius = deque()

for i in range(col):
    for j in range(row):
        if maze[i][j] <= 0: continue
        varius.append((i, j))
        can_change[i][j] = False

move = [[-1,0],[1,0],[0,1],[0,-1]]


va_cnt = [0, 0, 0]

while varius:
    for y, x in varius:
        can_change[y][x] = False
    for _ in range(len(varius)):
        y, x = varius.popleft()
        if maze[y][x] == 3: continue
        for ay, ax in move:
            dy, dx = y+ay, x+ax
            if dy<0 or dx<0 or dy>=col or dx>=row: continue
            if maze[dy][dx] == -1: continue
    
            if maze[dy][dx] == 0:
                varius.append((dy, dx))
                maze[dy][dx] = maze[y][x]
                continue
            
            if maze[dy][dx] + maze[y][x] == 3 and can_change[dy][dx]:
                maze[dy][dx] = 3
                continue

for i in range(col):
    for j in range(row):
        if maze[i][j] <= 0: continue
        va_cnt[maze[i][j]-1] += 1

print(*va_cnt)​

 


 

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[서강그라운드/G4/Python3]  (0) 2024.11.19
[보석 도둑/G2/Python3/C++]  (0) 2024.11.18
[꼬인 전깃줄/G2/Python3]  (0) 2024.11.16
[Strongly Connected Component/P5/Python3]  (0) 2024.11.15
[트리의 순회/G1/Python3]  (0) 2024.11.14