Algorithm (PS)

백준 18405 경쟁적 전염 Python 풀이

minjiwoo 2021. 11. 3. 22:46
728x90

유형 : DFS/BFS 

1. 바이러스의 종류는 1 ~ K 로, K 개이다. 

이 문제를 풀 때 바이러스가 상 하 좌 우 로 번식한다고 하니 

dfs / bfs로 이동하는걸 떠올렸다. 

그런데 나는 처음에 풀 때 dfs라고 생각했다 그런데 계속 재귀 호출 에러가 났다.

이 문제는 bfs로 풀어야 한다.

왜...? 왜일까 

bfs로 풀면 바이러스를 오름차순으로 정렬한다음에, 탐색할 수 있다 !!! 

풀이를 정리해 보면

1. graph 를 생성 !

정보를 받을 때 0초로 초기화 해서 저장한다. 이 문제의 특징은 s초가 지난 후의 x,y 좌표에 존재하는 바이러스 타입이 무엇인지 묻는 것이기 때문에 초 정보도 저장하는 것이 좋다.

2. 오름차순으로 바이러스 정렬

3. bfs 실행

# 경쟁적 전염
from collections import deque

n, k = map(int, input().split())

graph = []
data = []
for i in range(n):
    graph.append(list(map(int, input().split())))

for i in range(n):
    for j in range(n):
        if graph[i][j] != 0:
            data.append((graph[i][j],0,i,j)) # 바이러스 종류 - s - x - y

s, target_x, target_y = map(int, input().split())

dx = [1,-1,0,0]
dy = [0,0,1,-1]

data.sort()
q = deque(data)

while q:
    virus, time, x, y = q.popleft()
    if time == s:
        break
        
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]

        if nx >= 0 and nx < n and ny >= 0 and ny < n:
            if graph[nx][ny] == 0:
                graph[nx][ny] = virus
                q.append((virus, time+1, nx, ny))

print(graph[target_x-1][target_y-1])
728x90