Algorithm/baekjoon

탈출

마닐라 2022. 1. 24. 13:21

📍 문제 설명

 

💡 접근

'고슴도치는 물이 찰 예정인 칸으로 이동할 수 없다.' 는 조건만 잘 처리해주고 물이 먼저 이동하도록 하면 풀리는 문제였다.

 

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, h, k, answer, cnt, max, min, wall, result = Integer.MAX_VALUE;
    static char[][] board, clone;
    static int[][] dis;
    static boolean[][] visited,successRoute;
    static int[] parent = new int[100001];
    static int[] ch,pm, combi, graph;
    static boolean flag = false;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    static ArrayList<Point> list = new ArrayList<>();
    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        n = kb.nextInt();
        m = kb.nextInt();
        kb.nextLine();
        board = new char[n][m];
        dis = new int[n][m];
        //빈 곳 - '.' 물 - '*' 돌 - 'X' 비버굴 'D' 고슴도치 'S'
        for(int i = 0; i < n; i++) {
            String s = kb.nextLine();
            for(int j = 0; j < m; j++) {
                board[i][j] = s.charAt(j);
                if(board[i][j] == '*') list.add(new Point(i, j, '*'));
                else if(board[i][j] == 'S') list.add(new Point(i, j, 'S'));
            }
        }
        Collections.sort(list);
        //고슴도치와 물의 위치에서 동시에 퍼진다.
        //물과 고슴도치 따로 위치 저장해놓기
        if(T.solution()) System.out.println(answer);
        else System.out.println("KAKTUS");

    }

    private boolean solution() {
        //큐에 물의 위치 먼저 넣고 고슴도치 위치 넣기
        Queue<Point> q = new LinkedList<>();
        for(Point p : list) q.add(p);
        flag = false;
        while(!q.isEmpty()) {
            int len = q.size();
            for(int i = 0; i < len; i++) {
                Point cp = q.poll();
                //일단 물 먼저 퍼지기
                for(int j = 0; j < 4; j++) {
                    int nx = cp.x + dx[j];
                    int ny = cp.y + dy[j];
                    if(nx<0 || ny<0 || nx>=n || ny>=m || board[nx][ny] == 'X' || dis[nx][ny]!=0) continue;
                    //빈칸이면 거리를 기록한다.
                    if(board[nx][ny] == '.') {
                        dis[nx][ny] = dis[cp.x][cp.y] + 1;
                        if(cp.c == 'S') q.offer(new Point(nx, ny, 'S'));
                        else q.offer(new Point(nx,ny, '*'));
                    }
                    //비버의 굴이고 고슴도치가 왔으면 도착!
                    else if(board[nx][ny] == 'D' && cp.c == 'S') {
                        answer = dis[cp.x][cp.y] + 1;
                        flag = true;
                        return;
                    }
                }
            }
        }
        return flag;
    }

    private static class Point implements Comparable<Point> {
        private int x;
        private int y;
        private char c;

        public Point(int x, int y, char c) {
            this.x = x;
            this.y = y;
            this.c = c;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    ", c=" + c +
                    '}';
        }

        @Override
        public int compareTo(Point o) {
            return this.c - o.c;
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

로봇  (0) 2022.01.24
미로탈출  (0) 2022.01.24
미로 탈출하기  (0) 2022.01.23
연구소2  (0) 2022.01.23
연구소  (0) 2022.01.23