[백준] 18405번 경쟁적 전염

거북이·2023년 2월 17일
0

백준[골드5]

목록 보기
21/82
post-thumbnail

💡문제접근

  • 번호가 낮은 종류의 바이러스부터 어떻게 증식시켜야할지 고민했다.
  • queue에서 popleft를 하게 된다면 가장 맨 앞에 있는 원소부터 빼내는 방법을 취하게 되는데 이 때 가장 작은 번호가 앞에 있다면 낮은 종류의 바이러스부터 증식이 가능하게 된다.

💡코드(메모리 : 34192KB, 시간 : 184ms)

from collections import deque
import sys
input = sys.stdin.readline

virus_data = []
N, K = map(int, input().strip().split())
examiner = [list(map(int, input().strip().split())) for _ in range(N)]
for i in range(N):
    for j in range(N):
        if examiner[i][j] != 0:
        	# 바이러스의 번호, i행 j열 각각의 좌표값, 시간
            virus_data.append([examiner[i][j], i, j, 0])

S, X, Y = map(int, input().strip().split())
virus_data.sort()
queue = deque(virus_data)

while queue:
    virus, x, y, time = queue.popleft()
    if time == S:
        break
    dx = [0, 1, 0, -1]
    dy = [-1, 0, 1, 0]
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if nx < 0 or nx >= N or ny < 0 or ny >= N:
            continue
        if 0 <= nx < N and 0 <= ny < N:
            if examiner[nx][ny] == 0:
                examiner[nx][ny] = virus
                queue.append([virus, nx, ny, time + 1])

if examiner[X-1][Y-1] == 0:
    print(0)
else:
    print(examiner[X-1][Y-1])

💡소요시간 : 37m

0개의 댓글