반응형
이 문제는 우선순위 큐를 이용하여 입력을 받아준 후 bfs를 이용하면 되는 문제입니다.
이 문제에서는 N x N 크기의 시험관에서 K종류의 바이러스가 존재한다고 합니다.
그리고 이 바이러스는 숫자가 낮은 바이러스부터 차례대로 주변으로 한 칸씩 증식합니다.
이때 바이러스가 증식하는 순서를 정렬하기 위해서 PriorityQueue를 사용해줍니다.
그리고 각 초마다 증식하기 때문에 각 초마다 주변으로 1칸씩 우선순위 큐에 들어있는 순서대로 증식하게 만듭니다.
그리고 (3, 2) 칸에 바이러스가 존재한다면 바로 종료하도록 만들었습니다.
바로 코드를 보여드리도록 하겠습니다.
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[][] map;
static int[] dR = {1, -1, 0, 0};
static int[] dC = {0, 0, 1, -1};
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
map = new int[N+1][N+1];
for(int i = 1; i<=N; i++){
st = new StringTokenizer(br.readLine());
for(int j = 1; j<=N; j++)
map[i][j] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int time = Integer.parseInt(st.nextToken());
int row = Integer.parseInt(st.nextToken());
int col = Integer.parseInt(st.nextToken());
while(time-->0){
if(map[row][col] != 0)
break;
diffusion();
}
System.out.println(map[row][col]);
}
static void diffusion(){
Queue<Node> q = new PriorityQueue<>();
boolean[][] visited = new boolean[N+1][N+1];
for(int i = 1; i<=N; i++){
for(int j = 1; j<=N; j++){
if(map[i][j] != 0){
visited[i][j] = true;
q.offer(new Node(i, j, map[i][j]));
}
}
}
while(!q.isEmpty()){
Node a = q.poll();
for(int i = 0; i<4; i++){
int dr = a.row + dR[i];
int dc = a.col + dC[i];
if(dr<1||dc<1||dr>N||dc>N)
continue;
if(visited[dr][dc])
continue;
map[dr][dc] = a.val;
visited[dr][dc] = true;
}
}
}
}
class Node implements Comparable<Node>{
int row, col, val;
Node(int row, int col, int val){
this.row = row;
this.col = col;
this.val = val;
}
@Override
public int compareTo(Node a){
return this.val - a.val;
}
}
우선순위 큐를 이용하여 bfs를 진행해주면 되는 문제였습니다.
반응형
'알고리즘 > 너비 우선 탐색(bfs)' 카테고리의 다른 글
백준 2583번 : 영역 구하기 java (0) | 2022.07.03 |
---|---|
백준 5567번 : 결혼식 java (0) | 2022.07.02 |
백준 1261번 : 알고스팟 java (0) | 2022.06.27 |
백준 16236번 : 아기 상어 java (0) | 2022.06.25 |
백준 2589번 : 보물섬 java (0) | 2022.06.24 |
댓글