본문 바로가기
문제풀이

백준 18405번 경쟁적감염 JAVA

by AndoneKwon 2020. 11. 5.

처음에 바이러스의 위치를 받을때 바이러스 숫자가 작은 순으로 퍼져야 하기때문에 Priority Queue를 이용해서 큐를 받아야 한다..만 난 처음에 아무생각 없이 그냥 큐로 짜놓고 우선순위 큐로 바꾸기 싫어서 그냥 배열로 바꾸고 그걸 정렬하고 그걸 큐에 집어넣는 식으로 처리했다.

package com.company;
import java.io.*;
import java.util.*;

class Point{
    int X;
    int Y;
    int number;

    Point(int x, int y,int number){
        this.X=x;
        this.Y=y;
        this.number=number;
    }
}

public class Main {
    public static void printMap(int[][] map){
        for(int i=0;i<map.length;i++){
            for(int j=0;j<map.length;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println();

    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        Deque<Point> queue = new ArrayDeque<>();

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int[] dx={0,1,0,-1};
        int[] dy={1,0,-1,0};
        int[][] map = new int[N][N];

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

        st = new StringTokenizer(br.readLine());
        int S = Integer.parseInt(st.nextToken());
        int X = Integer.parseInt(st.nextToken());
        int Y = Integer.parseInt(st.nextToken());

        for(int i=0;i<N;i++){
            int a=0;
            for(int j=0;j<N;j++){
                if(map[i][j]!=0){
                    queue.offer(new Point(i,j,map[i][j]));
                }
            }
        }

        Point[] a = queue.toArray(new Point[0]);
        Arrays.sort(a,new Comparator<Point>(){
            @Override
            public int compare(Point o1, Point o2) {
                return o1.number-o2.number;
            }
        });

        queue.clear();
        for(Point point : a){
            queue.add(point);
        }

        int checkTurn = 0;
        Deque<Point> tempDeque = new ArrayDeque<>();
        while (checkTurn<S){
            if(queue.isEmpty()){
                break;
            }
            for(int i=0;i<=queue.size();i++){
                tempDeque.offer(queue.poll());
            }
            while (!tempDeque.isEmpty()) {
                Point p = tempDeque.poll();
                for (int i = 0; i < 4; i++) {
                    if (p.X + dx[i]>=0&&p.Y + dy[i]>=0&&p.X + dx[i]<N&&p.Y + dy[i]<N&&map[p.X + dx[i]][p.Y + dy[i]] == 0) {
                        map[p.X + dx[i]][p.Y + dy[i]] = p.number;
                        queue.offer(new Point(p.X + dx[i], p.Y + dy[i], p.number));
                    }
                }
            }
            //printMap(map);
            checkTurn++;
        }

        bw.write(Integer.toString(map[X-1][Y-1]));
        bw.flush();
        bw.close();
    }
}

'문제풀이' 카테고리의 다른 글

백준 14502번 연구실 JAVA  (0) 2020.11.09
백준 15686 치킨배달 JAVA  (0) 2020.11.05
백준 11479번 통나무건너뛰기 JAVA  (0) 2020.11.03
백준 3273번 두수의합 JAVA  (0) 2020.10.11
백준 14888번 연산자끼워넣기 JAVA  (0) 2020.10.11