BOJ 4179. ๋ถˆ!

1 minute read

BOJ 4179. ๋ถˆ!

image image

ํ’€์ด

#, ., J, F๋กœ ์ด๋ฃจ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง€๊ณ ,
์ฃผ์–ด์ง„ ๊ฐ’๋“ค์€ ๊ฐ๊ฐ ๋ฒฝ, ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„, ์ง€ํ›ˆ์ด์˜ ์ดˆ๊ธฐ์œ„์น˜, ๋ถˆ์ด๋‚œ๊ณต๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

๋ถˆ์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ฒˆ์ง€๋ฏ€๋กœ ๋ถˆ์˜ ์ „ํŒŒ ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € BFS๋กœ ๊ตฌํ•œ๋‹ค.
๋ถˆ์ด ๋ฒˆ์งˆ ๋•Œ๋งˆ๋‹ค ๋ฒˆ์ง„์‹œ๊ฐ„์„ ์ €์žฅํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ง€ํ›ˆ์ด๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ BFS๋กœ ๊ตฌํ•˜๋Š”๋ฐ,
์ง€ํ›ˆ์ด๊ฐ€ ํŠน์ • ์นธ์„ x์‹œ๊ฐ„์— ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ,
๊ทธ ์นธ์— x์‹œ๊ฐ„์ด๋‚˜ ๊ทธ ์‹œ๊ฐ„ ์ด์ „์— ๋ถˆ์ด ์ „ํŒŒ๋˜์—ˆ๋‹ค๋ฉด, ์ง€ํ›ˆ์ด๋Š” ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ์ธ ๊ฒƒ์ด๋‹ค.

์ง€ํ›ˆ์ด๊ฐ€ ์ฃผ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์„ ๋•Œ์˜ ๊ฑฐ๋ฆฌ +1์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

import java.io.*;
import java.util.LinkedList;
import java.util.Queue;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, 1, 0, -1};

        Queue<int[]> h = new LinkedList<>();
        Queue<int[]> f = new LinkedList<>();
        String[][] board = new String[n][m];
        int[][] hDist = new int[n][m];
        int[][] fDist = new int[n][m];

        for (int i = 0; i < n; i++) {
            String s = br.readLine();
            for (int j = 0; j < m; j++) {
                board[i][j] = String.valueOf(s.charAt(j));
                if (board[i][j].equals("#") || board[i][j].equals(".")) {
                    hDist[i][j] = -1;
                    fDist[i][j] = -1;
                }
                if (board[i][j].equals("J")) {
                    h.offer(new int[]{i, j});
                }
                if (board[i][j].equals("F")) {
                    f.offer(new int[]{i, j});
                    hDist[i][j] = -1;
                }
            }
        }
        while (!f.isEmpty()) {
            int[] p = f.poll();
            for (int d = 0; d < 4; d++) {
                int x = p[0] + dx[d];
                int y = p[1] + dy[d];

                if (x < 0 || x >= n || y < 0 || y >= m) continue;
                if (board[x][y].equals("#") || fDist[x][y] > 0) continue;
                f.offer(new int[]{x, y});
                fDist[x][y] = fDist[p[0]][p[1]] + 1;
            }
        }

        while (!h.isEmpty()) {
            int[] p = h.poll();
            for (int d = 0; d < 4; d++) {
                int x = p[0] + dx[d];
                int y = p[1] + dy[d];

                if (x < 0 || x >= n || y < 0 || y >= m) {
                    System.out.println(hDist[p[0]][p[1]] + 1);
                    return;
                }
                if (hDist[x][y] > 0 || board[x][y].equals("#")) continue;
                if (fDist[x][y] != -1 && hDist[p[0]][p[1]] + 1 >= fDist[x][y]) continue;
                h.offer(new int[]{x, y});
                hDist[x][y] = hDist[p[0]][p[1]] + 1;
            }
        }

        System.out.println("IMPOSSIBLE");
    }
}