BOJ 18405: 경쟁적 전염 https://www.acmicpc.net/problem/18405
번호가 낮은 종류의 바이러스부터 먼저 증식
한다.BFS
를 사용한다.바이러스의 번호
, 퍼진 시간
, 행 좌표
, 열 좌표
list를 오름차순 정렬
한 뒤 deque으로 변환
한다.import sys
from collections import deque
N, K = map(int, sys.stdin.readline().split())
board = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
S, X, Y = map(int, sys.stdin.readline().split())
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]
time = 0
arr = list() # 초기 바이러스의 정보를 담을 리스트
for i in range(N):
for j in range(N):
if board[i][j] != 0:
arr.append([board[i][j], time, i, j])
arr.sort() # 바이러스 번호를 기준으로 오름차순 정렬함
que = deque(arr) # 초기 바이러스의 정보가 담긴 리스트를 deque으로 변환
while que:
now = que.popleft()
nowValue = now[0] # 바이러스 번호
nowTime = now[1] # 바이러스가 퍼졋던 시간
nowX = now[2] # 바이러스의 행 좌표
nowY = now[3] # 바이러스의 열 좌표
# 목표 시간이 되면 탐색 종료
if nowTime == S:
break
# 4 방향 탐색
for t in range(4):
nx = nowX + dx[t]
ny = nowY + dy[t]
# 범위 체크
if nx < 0 or ny < 0 or nx >= N or ny >= N:
continue
# 해당 위치에 다른 바이러스가 있는지 체크
if board[nx][ny] != 0:
continue
# que에 바이러스 삽입
que.append([nowValue, nowTime + 1, nx, ny])
# 연구소에 해당 바이러스 번호 입력
board[nx][ny] = nowValue
time += 1 # 시간 +1
print(board[X-1][Y-1])