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

[Java] BOJ 14940 ์‰ฌ์šด ์ตœ๋‹จ๊ฑฐ๋ฆฌ

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

๋ฌธ์ œ 

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

  • ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๋ชจ๋“  ์ง€์ ์— ๋Œ€ํ•ด์„œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.
  • ๋ฌธ์ œ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์˜ค์ง ๊ฐ€๋กœ์™€ ์„ธ๋กœ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์ž.
  • ์ง€๋„์˜ ํฌ๊ธฐ n๊ณผ m์ด ์ฃผ์–ด์ง„๋‹ค. n์€ ์„ธ๋กœ์˜ ํฌ๊ธฐ, m์€ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ๋‹ค.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)
  • ๋‹ค์Œ n๊ฐœ์˜ ์ค„์— m๊ฐœ์˜ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๋•…์ด๊ณ  1์€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋•…, 2๋Š” ๋ชฉํ‘œ์ง€์ ์ด๋‹ค. ์ž…๋ ฅ์—์„œ 2๋Š” ๋‹จ ํ•œ๊ฐœ์ด๋‹ค.
  • ๊ฐ ์ง€์ ์—์„œ ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์›๋ž˜ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๋•…์ธ ์œ„์น˜๋Š” 0์„ ์ถœ๋ ฅํ•˜๊ณ , ์›๋ž˜ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋•…์ธ ๋ถ€๋ถ„ ์ค‘์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

  • ๊ธธ ์ •๋ณด๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋Š”๋ฐ ์ด๋•Œ ๊ฐ’์ด 2๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด ๋„์ฐฉ์ง€์ ์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ๋œ ๋„์ฐฉ์ง€์ ์˜ ์ขŒํ‘œ๊ฐ’์œผ๋กœ BFS๋ฅผ ๋Œ๋ฆฌ๋Š”๋ฐ BFS์—์„œ ์‹œ์ž‘์ ์„ ๋„์ฐฉ์ง€์ ์˜ ์ขŒํ‘œ๊ฐ’์œผ๋กœ ํ•ด์„œ while๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค. (์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผ๋˜๋ฏ€๋กœ BFS๋ฅผ ์“ฐ๊ณ  ๋ชฉํ‘œ์ง€์ ์ด ํ•œ๊ฐœ์ด๋ฏ€๋กœ ์—ญ์œผ๋กœ ์ƒ๊ฐํ•ด์„œ ๋ชฉํ‘œ์ง€์ ์„ ์‹œ์ž‘์ ์œผ๋กœ ๋‘๊ณ  ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๊ฑฐ๋ฆฌ๋ฅผ ์žฌ๋ฉด BFS๋ฅผ ํ•œ๋ฒˆ๋งŒ ๋Œ์•„๋„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)
  • while๋ฌธ์—์„œ Queue์—์„œ ๋บ€ ๊ฐ’์„ ๊ธฐ์ค€์ขŒํ‘œ๋กœ ์ƒํ•˜์ขŒ์šฐ ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’์ด ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๊ธธ์˜ ์ •๋ณด๊ฐ€ 1์ผ ๋•Œ, ๊ธฐ์ค€์ขŒํ‘œ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ฑฐ๋ฆฌ + 1ํ•œ ๊ฐ’์„ ๊ฒฐ๊ณผ๊ฐ’์— ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ํ›„, Queue์— ๋„ฃ๋Š”๋‹ค.
  • BFS๋ฅผ ๋‹ค ๋Œ๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๊ธธ์˜ ์ •๋ณด๊ฐ€ 1์ด๋ผ๋ฉด ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ณณ์— ์‹œ์ž‘์ ์ด ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ -1์„ ๊ฒฐ๊ณผ๊ฐ’์— ์ €์žฅํ•ด์ฃผ๊ณ  ๊ฒฐ๊ณผ๊ฐ’ ๋ฐฐ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

  • X

BFS๋Š” ์–ด๋Š์ •๋„ ๊ฐ์„ ์žก์€ ๊ฒƒ ๊ฐ™๋‹ค..!

์ฝ”๋“œ

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

public class BOJ14940 {

    static int n;
    static int m;
    static int map[][];
    static int result[][];
    static int dx[] = {-1, 1, 0, 0};
    static int dy[] = {0, 0, -1, 1};
    static int end_x;
    static int end_y;
    static boolean visited[][];

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

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

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

        // ๊ธธ์„ ์ €์žฅํ•  ์ง€๋„
        map = new int[n][m];
        // ๋ชฉํ‘œ์ง€์ ๊นŒ์ง€ ๊ฐˆ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  2์ฐจ์› ๋ฐฐ์—ด
        result = new int[n][m];

        // ๋„์ฐฉ์ง€์ ์˜ x, y ์ขŒํ‘œ๊ฐ’
        end_x = 0;
        end_y = 0;

        // ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์ €์žฅํ•  ๋ฐฐ์—ด
        visited = new boolean[n][m];

        // ์ง€๋„์— ๊ธธ ์ €์žฅ
        for(int i = 0; i < n; i++){
            StringTokenizer st2 = new StringTokenizer(br.readLine());

            for(int j = 0; j < m; j++){
                int r = Integer.parseInt(st2.nextToken());

                // ๋งŒ์•ฝ ์ž…๋ ฅ๊ฐ’์ด 2๋ผ๋ฉด ๋„์ฐฉ์ง€์  ๋ณ€์ˆ˜์— ์ €์žฅ
                if(r == 2){
                    end_x = i;
                    end_y = j;
                }

                map[i][j] = r;
            }
        }

        // ๋ชฉํ‘œ์ง€์  ์ขŒํ‘œ๊ฐ’์œผ๋กœ BFS๋ฅผ ๋Œ๋ฆผ
        BFS(end_x, end_y);

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                // ๋งŒ์•ฝ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ขŒํ‘œ๊ฐ’์ด 1์ด๋ผ๋ฉด
                // ๋ชฉํ‘œ์ง€์ ์—์„œ ์‹œ์ž‘์ง€์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ
                // ๊ฒฐ๊ณผ๊ฐ’์„ -1๋กœ ์ €์žฅ
                if(!visited[i][j] && (map[i][j] == 1)){
                    result[i][j] = -1;
                }

                sb.append(result[i][j] + " ");
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }

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

        // ์‹œ์ž‘์ง€์ ์„ Queue์— ๋„ฃ์–ด์คŒ
        q.offer(new Point(x, y));

        // ๋ชฉํ‘œ์ง€์ ์„ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ 
        visited[x][y] = true;
        // ๊ฒฐ๊ณผ๊ฐ’ ๋ฐฐ์—ด์— ๋ชฉํ‘œ์ง€์  ๊ฐ’์„ 0์œผ๋กœ ์ €์žฅ
        result[x][y] = 0;

        // Queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()){
            int xx = q.peek().x;
            int yy = q.peek().y;

            // Queue์—์„œ ๋นผ์คŒ
            q.poll();

            for(int i = 0; i < 4; i++){
                // ๊ธฐ์ค€ ์ขŒํ‘œ๊ฐ’์—์„œ ์ƒํ•˜์ขŒ์šฐ ์ด๋™ํ•œ ๊ฐ’
                int nx = xx + dx[i];
                int ny = yy + dy[i];

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

                // ๋งŒ์•ฝ ์ด๋™ํ•œ ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ  ๋ฐฐ์—ด์˜ ๊ฐ’์ด 1์ด๋ผ๋ฉด
                if(!visited[nx][ny] && (map[nx][ny] == 1)){
                    // ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’์— ์œ„์น˜ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ’ ๋ฐฐ์—ด์—
                    // ๊ธฐ์ค€ ์ขŒํ‘œ๊ฐ’ ์œ„์น˜์˜ ๊ฐ’์— + 1 ๋”ํ•œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ 
                    result[nx][ny] = result[xx][yy] + 1;
                    // ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•ด์คŒ
                    visited[nx][ny] = true;
                    // ๋งˆ๋ฌด๋ฆฌ๋กœ Queue์— ์ด๋™ํ•œ ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์คŒ
                    q.offer(new Point(nx, ny));
                }
            }
        }
    }
}



'์•Œ๊ณ ๋ฆฌ์ฆ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] BOJ 7569 ํ† ๋งˆํ†   (0) 2024.09.01
[Java] BOJ 5430 AC  (4) 2024.08.31
[Java] BOJ 11403 ๊ฒฝ๋กœ ์ฐพ๊ธฐ  (0) 2024.08.27
[Java] BOJ 11286 ์ ˆ๋Œ“๊ฐ’ ํž™  (2) 2024.08.26
[Java] BOJ 6064 ์นด์ž‰ ๋‹ฌ๋ ฅ  (0) 2024.08.25