๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 21736 ํ—Œ๋‚ด๊ธฐ๋Š” ์นœ๊ตฌ๊ฐ€ ํ•„์š”ํ•ด

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 16.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/21736

  • ๋„์—ฐ์ด๊ฐ€ ๋‹ค๋‹ˆ๋Š” ๋Œ€ํ•™์˜ ์บ ํผ์Šค๋Š” N×Mํฌ๊ธฐ์ด๋ฉฐ ์บ ํผ์Šค์—์„œ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฒฝ์ด ์•„๋‹Œ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์—ฐ์ด๊ฐ€ (x, y)์— ์žˆ๋‹ค๋ฉด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ (x+1, y), (x, y+1), (x−1, y), (x, y−1)์ด๋‹ค.
  • ๋‹จ, ์บ ํผ์Šค์˜ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜๋Š” ์—†๋‹ค.
  • ๋ถˆ์Œํ•œ ๋„์—ฐ์ด๋ฅผ ์œ„ํ•˜์—ฌ ์บ ํผ์Šค์—์„œ ๋„์—ฐ์ด๊ฐ€ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.
  • ์ฒซ์งธ ์ค„์—๋Š” ์บ ํผ์Šค์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ N(1 ≤ N ≤ 600), M(1 ≤ M ≤ 600)์ด ์ฃผ์–ด์ง„๋‹ค.
  • ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ์บ ํผ์Šค์˜ ์ •๋ณด๋“ค์ด ์ฃผ์–ด์ง„๋‹ค. 
  • O๋Š” ๋นˆ ๊ณต๊ฐ„, X๋Š” ๋ฒฝ, I๋Š” ๋„์—ฐ์ด, P๋Š” ์‚ฌ๋žŒ์ด๋‹ค. I๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง์ด ๋ณด์žฅ๋œ๋‹ค.
  • ์ฒซ์งธ ์ค„์— ๋„์—ฐ์ด๊ฐ€ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹จ, ์•„๋ฌด๋„ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ TT๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์•„์ด๋””์–ด

  • I์˜ ์ขŒํ‘œ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ BFS๋ฅผ ๋Œ๋ฆฌ๋ฉด์„œ ์ƒํ•˜์ขŒ์šฐ ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  O์ผ ๊ฒฝ์šฐ, Queue์— ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์„œ ๊ณ„์† ํƒ์ƒ‰ํ•œ๋‹ค.
  • ์ขŒํ‘œ๊ฐ’์ด P์ผ ๊ฒฝ์šฐ, ์‚ฌ๋žŒ ์ˆ˜๋ฅผ ์นด์šดํŠธ ํ•ด์ฃผ๊ณ  ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Queue์— ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด ๊ณ„์† ํƒ์ƒ‰ํ•œ๋‹ค.

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • X

BFS๋Š” ์–ผ์ถ” ์ด์ œ ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™๋‹ค..! (DFS๊ฐ€ ๋ฌธ์ œ๋„ค....)

์ฝ”๋“œ

import java.awt.*;
import java.io.*;
import java.util.*;

public class BOJ21736 {

    static int N;
    static int M;
    static char campus[][];
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};
    static boolean visited[][];
    static int cnt;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        // ํ–‰
        N = Integer.parseInt(st.nextToken());
        // ์—ด
        M = Integer.parseInt(st.nextToken());

        // ์บ ํผ์Šค๋ฅผ ์ €์žฅํ•  2์ฐจ์› ๋ฐฐ์—ด
        campus = new char[N][M];
        // ๋ฐฐ์—ด์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
        visited = new boolean[N][M];
        // ๋งŒ๋‚œ ์‚ฌ๋žŒ์˜ ์ˆ˜
        cnt = 0;

        // ๋„์—ฐ์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜
        int d_x = 0;
        int d_y = 0;

        for(int i = 0; i < N; i++){
            String s = br.readLine();

            for(int j = 0; j < M; j++){
                char c = s.charAt(j);

                // c๊ฐ€ I์ผ ๊ฒฝ์šฐ, ๊ทธ ์ขŒํ‘œ๊ฐ€ ๋„์—ฐ์˜ ์ขŒํ‘œ์ด๋ฏ€๋กœ
                // ๋„์—ฐ์˜ ์ขŒํ‘œ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ
                if(c == 'I'){
                    d_x = i;
                    d_y = j;
                }

                // ์บ ํผ์Šค์— ์ •๋ณด๋ฅผ ์ €์žฅ
                campus[i][j] = c;
            }
        }

        // ๋„์—ฐ์ด์˜ ์ขŒํ‘œ๋ฃŒ BFS๋ฅผ ๋Œ๋ฆผ
        BFS(d_x, d_y);

        if(cnt == 0){
            System.out.println("TT");
        }
        else{
            System.out.println(cnt);
        }
    }

    public static void BFS(int x, int y){
        Queue<Point> q = new LinkedList<>();

        // ๋„์—ฐ์ด๊ฐ€ ์žˆ๋Š” ์ขŒํ‘œ๋ฅผ Queue์— ๋„ฃ์–ด์คŒ
        q.offer(new Point(x, y));

        // ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
        visited[x][y] = true;

        // Queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()){
            // ์ขŒํ‘œ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅ
            int node_x = q.peek().x;
            int node_y = q.peek().y;

            q.poll();

            for(int i = 0; i < 4; i++){
                // ์ƒํ•˜์ขŒ์šฐ์˜ ์ขŒํ‘œ๊ฐ’์„ ์ €์žฅ
                int nx = node_x + dx[i];
                int ny = node_y + dy[i];

                // ๋งŒ์•ฝ ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์ด ๋ฐฐ์—ด๋ฒ”์œ„๋ฅผ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด continue
                if(nx >= N || nx < 0 || ny >= M || ny < 0){
                    continue;
                }

                // ๋ฒ”์œ„์•ˆ์— ๋“ค๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                if(!visited[nx][ny]){
                    // ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ 
                    visited[nx][ny] = true;

                    // ๋งŒ์•ฝ ํ•ด๋‹น ๋ฐฐ์—ด๊ฐ’์ด P๋ผ๋ฉด ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
                    if(campus[nx][ny] == 'P'){
                        // ์‚ฌ๋žŒ ์ˆ˜ + 1 ํ•˜๊ณ 
                        cnt = cnt + 1;

                        // Queue์— ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์Œ
                        q.offer(new Point(nx, ny));
                    }
                    // ๋ฐฐ์—ด๊ฐ’์ด O๋ผ๋ฉด ๋นˆ ๊ณต๊ฐ„์ด๋ฏ€๋กœ
                    else if(campus[nx][ny] == 'O'){
                        // Queue์— ํ•ด๋‹น ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์Œ
                        q.offer(new Point(nx, ny));
                    }
                }
            }
        }

    }
}