[이·코·테] Q17. 경쟁적 전염

이정진·2021년 8월 10일
0

이·코·테

목록 보기
9/20
post-thumbnail

소스 코드 :

from collections import deque

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

data = []
graph = []
for i in range(n):
    graph.append(list(map(int, input().split())))
    for j in range(n):
        if graph[i][j] > 0:
            # 바이러스 타입, x좌표, y좌표 순
            data.append((graph[i][j], i, j, 0))
    
s, x, y = map(int, input().split())

# 상, 하, 좌, 우 방향 리스트
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

data.sort()
q = deque(data)

while q:
    virusNum, a, b, time = q.popleft()
    
    # 시간 일치할 경우, 탈출
    if time == s:
        break
        
    # 작은 번호부터 순서대로 바이러스 전염 진행
    for i in range(4):
        na = a + dx[i]
        nb = b + dy[i]
        if 0 <= na and na < n and 0 <= nb and nb < n and graph[na][nb] == 0:
            graph[na][nb] = virusNum
            q.append((virusNum, na, nb, time + 1))

print(graph[x -1][y - 1])
    
'''
시험관에 존재하는 모든 바이러스는 1초마다 상, 하, 좌, 우의 방향으로 증식해 나간다. 단, 매 초마다 번호가 낮은 종류의 바이러스부터 먼저 증식한다. 또한 증식 과정에서 특정한 칸에 이미 어떠한 바이러스가 존재한다면, 그 곳에는 다른 바이러스가 들어갈 수 없다.

Q. 번호별로 좌표의 위치를 어떻게 파악할 것인가?따로 리스트를 만들어서 관리할 건가?
A. 반복문을 돌리면서 확인하는 것은 1초 / 256MB의 제한 조건에서 시간복잡도 상의 문제로 시간 초과가 발생할 것이므로 별도로 관리해야 할 것이다. 
--> 큐를 이용해서 입력받은 값 관리 // 단, 바이러스타입과 시간도 해당 큐에서 튜플을 통해서 같이 관리하여야 함. time은 변수를 따로 선언해서 진행할 수 없었음 
'''

0개의 댓글

관련 채용 정보