BOJ 18405 경쟁적 전염

LONGNEW·2021년 8월 23일
0

BOJ

목록 보기
253/333

https://www.acmicpc.net/problem/18405
시간 1초, 메모리 256MB

input :

  • N, K (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000)
  • 시험관의 정보
  • S, X, Y (0 ≤ S ≤ 10,000, 1 ≤ X, Y ≤ N)

output :

  • S초 뒤에 (X,Y)에 존재하는 바이러스의 종류를 출력한다. 만약 S초 뒤에 해당 위치에 바이러스가 존재하지 않는다면, 0을 출력한다.

조건 :

  • 모든 바이러스는 1초마다 상, 하, 좌, 우의 방향으로 증식

  • 단, 매 초마다 번호가 낮은 종류의 바이러스부터 먼저 증식한다.

  • 증식 과정에서 특정한 칸에 이미 어떠한 바이러스가 존재한다면, 그 곳에는 다른 바이러스가 들어갈 수 없다.


바이러스의 번호에 따라 우선순위가 존재하는 거고, 날짜에 따라 어디까지 증식을 할지를 정해야 한다.

맨 처음 입력을 받을 때에 각 바이러스의 위치를 저장하도록 하고 이 배열을 정렬하여 우선순위를 맞춰준다.

BFS의 방식을 사용하면 어차피 큐에 순서대로 우선순위를 유지한채로 저장이 될 것이다.

날짜

날짜를 구분하려면 각 날짜에 해당하는 큐의 길이를 가지고 BFS를 수행하도록 하자.
이를 통해 날짜를 구분할 수 있을 것이다.

import sys
from collections import deque

n, k = map(int, sys.stdin.readline().split())
data, pos = [], []
dx, dy = [0, 0, 1, -1], [1, -1, 0, 0]

for i in range(n):
    temp = list(map(int, sys.stdin.readline().split()))
    data.append(temp)

    for j in range(n):
        if temp[j] != 0:
            pos.append((temp[j], i, j))

s, x, y = map(int, sys.stdin.readline().split())
pos.sort()
q = deque(pos)

for i in range(s):
    
    for j in range(len(q)):
        value, now_x, now_y = q.popleft()

        for k in range(4):
            nx = now_x + dx[k]
            ny = now_y + dy[k]

            if nx < 0 or nx >= n or ny < 0 or ny >= n:
                continue

            if data[nx][ny] == 0:
                data[nx][ny] = data[now_x][now_y]
                q.append((data[now_x][now_y], nx, ny))

print(data[x - 1][y - 1])

0개의 댓글