💻 입력 조건
💻 출력 조건
💻 입력 예시1
3 3 1 0 2 0 0 0 3 0 0 2 3 2
💻 출력 예시1
3
💻 입력 예시2
3 3 1 0 2 0 0 0 3 0 0 1 2 2
💻 출력
0
📖 문제 해결
주어진 시간 동안 바이러스를 순서대로 증식시킨 후 찾고자 하는 좌표의 바이러스 종류를 출력시키는 코드를 작성하였습니다. 이때, '바이러스를 순서대로 증식시키는 코드'는 bfs를 이용하여 작성하였습니다. 구체적으로 설명하자면 다음과 같습니다. 맨 처음에 주어진 바이러스의 좌표 정보를 queue
에 차례대로 (virus,r_idx,c_idx)
의 형태로 넣은 후 popleft()
함수를 이용하여 차례대로 뽑으며 해당 바이러스의 상하좌우로 바이러스를 증식시킵니다. 바이러스를 증식시킬 때마다 증식시킨 바이러스와 그 위치를 다시 queue
에 추가해 줍니다. 이때, 이전에 증식시킨 바이러스가 k이며 이번에 증식시키고자 하는 바이러스가 1인 경우 sec
(시간 정보를 담아두는 변수)에 1을 더해주고, 이 sec
이 s
와 같아지면 증식을 멈춥니다. 증식을 멈춘 test_tube
에서 x-1, y-1
에 위치한 바이러스 정보를 출력하면 문제에서 제시한 좌표에 있는 바이러스 종류를 알 수 있습니다.
# n, k 입력 받기
n,k = list(map(int,input().split()))
# test_tube 정보 입력 받기
test_tube = []
for i in range(n):
test_tube.append(list(map(int,input().split())))
s, x, y = list(map(int,input().split()))
from collections import deque
queue = deque()
# 바이러스의 위치 정보를 순서대로 queue에 넣기
for virus in range(1,k+1):
for r_idx, row in enumerate(test_tube):
for c_idx, col in enumerate(row):
if test_tube[r_idx][c_idx] == virus:
queue.append((virus,r_idx,c_idx))
dx = [+1, -1, 0, 0]
dy = [0, 0, +1, -1]
prev = 0
sec = 0
# 주어진 시간 동안 바이러스 순서대로 증식시키기
while True:
virus_inform = queue.popleft()
if prev == 3 and virus_inform[0] ==1 :
sec += 1
if sec == s:
break
for i in range(4):
minimum_ = 0 <= virus_inform[1]+dx[i] and 0 <= virus_inform[2]+dy[i]
maximum_ = virus_inform[1]+dx[i] <= n-1 and virus_inform[2]+dy[i] <= n-1
if minimum_ and maximum_ and test_tube[virus_inform[1]+dx[i]][virus_inform[2]+dy[i]] == 0:
test_tube[virus_inform[1]+dx[i]][virus_inform[2]+dy[i]] = virus_inform[0]
queue.append((virus_inform[0],virus_inform[1]+dx[i],virus_inform[2]+dy[i]))
prev = virus_inform[0]
print(test_tube[x-1][y-1])