Algorithm/백준 문제풀이

[백준] 18405 경쟁적 전염 - Java

너지살 2023. 11. 5. 23:32

 

 

 

문제 출저

https://www.acmicpc.net/problem/18405

 

18405번: 경쟁적 전염

첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치

www.acmicpc.net

 

 

 

 

문제 출저

2차원 배열에 바이러스가 숫자로 부여됩니다.

바이러스는 1초에 상하좌우로 퍼지고 이미 바이러스가 있다면 퍼지지 않습니다.

s 초 후, (x,y) 좌표에 어떤 바이러스가 있는지 구해야 합니다. 

 

 

구현으로 문제룰 플었습니다. 

dot 클래스를 만들어 x,y,count 좌표를 만들었습니다.

List<Queue<dot>> virus 자료형을 만들어 바이러스 번호대로 위치를 저장했습니다.

for문으로 초 순서대로 낮은 숫자대로 바이러스가 퍼지는 것을 구현했습니다. 

dot의 count는 초를 나타내는 단위로 doc.count 랑 그 순간의 초인 것만 퍼지도록 계산했습니다.

 

 

 

소스 코드

package baekjoon.backjoon11.day0110.day05;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/*
경쟁적 전염
https://www.acmicpc.net/problem/18405
 */
public class B18405 {

  static int n, k;
  static int[][] board;
  static int s, x, y;

  static int[] dx = {1,0,-1,0};
  static int[] dy = {0,-1,0,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());
    k = Integer.parseInt(st.nextToken());

    board = new int[n][n];
    for(int i = 0; i < n; i++) {
      st = new StringTokenizer(br.readLine());
      for(int j = 0; j < n; j++) {
        board[i][j] = Integer.parseInt(st.nextToken());
      }
    }

    st = new StringTokenizer(br.readLine());
    s = Integer.parseInt(st.nextToken());
    y = Integer.parseInt(st.nextToken());
    x = Integer.parseInt(st.nextToken());

    List<Queue<dot>> virus = new ArrayList<>();
    for(int i = 0; i <= k; i++) {
      virus.add(new LinkedList<>());
    }

    for(int i = 0; i < n; i++) {
      for(int j = 0; j < n; j++) {
        if(board[i][j] != 0) {
          int number = board[i][j];
          virus.get(number).add(new dot(i, j, 0));
        }
      }
    }

    for(int i = 0; i < s; i++) {
      for(int j = 0; j <= k; j++) {
        Queue<dot> que = virus.get(j);


        while(!que.isEmpty() && que.peek().count == i) {
          dot d = que.poll();
          for(int k = 0; k < 4; k++) {
            int ny = d.y + dy[k];
            int nx = d.x + dx[k];

            if (check(ny, nx)) {
              board[ny][nx] = j;
              que.add(new dot(ny, nx, d.count + 1));
            }
          }
        }
      }
    }

    System.out.println(board[y-1][x-1]);

  }



  public static boolean check(int y, int x) {
    if(y >= 0 && y < n && x >= 0 && x < n && board[y][x] == 0) {
      return true;
    }
    else {
      return false;
    }
  }

  public static class dot {
    int y;
    int x;
    int count;

    dot(int y, int x, int count) {
      this.y = y;
      this.x = x;
      this.count = count;
    }
  }
}