๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฌธ์ œํ’€์ด] ๋ฐฑ์ค€ 5427 ๋ถˆ

by bamDal 2025. 2. 14.

 

 

๐Ÿ›Ž๏ธ ๋ฌธ์ œ 

 

๐Ÿ“ข ํ‹€๋ฆฐ ์ด์œ 

๋ถˆ์ด ํผ์ง€๋Š” ๊ฐ„๊ฒฉ๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์›€์ง์ด๋Š” ๊ฐ„๊ฒฉ์ด ๊ฐ™์œผ๋ ค๋ฉด BFS๋ฅผ ๋Œ๋ฆด ๋•Œ ๋ถˆ์ด ๊ฐˆ ๊ณณ์„ ํƒ์ƒ‰ํ•˜๊ณ  que์— ๋„ฃ๋Š” depth์™€ ์ƒ๊ทผ์ด๊ฐ€ ์ด๋™ํ•˜๋Š” depth๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

๊ทธ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•ด์„œ ๊ณ„์† ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ "IMPOSSIBLE"์ด ๋‚˜์™”๋‹ค.

 

๐Ÿ˜€ ์ œ๋Œ€๋กœ ๋œ ์ฝ”๋“œ

์ œ๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ ค๋ฉด ๋ถˆ์„ ๋„ฃ๋Š” ํ ์‚ฌ์ด์ฆˆ๋งŒํผ๋งŒ ๋‹ค์Œ ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ƒ๊ทผ์ด๋„ ์ƒ๊ทผ์ด์˜ ํ ์‚ฌ์ด์ฆˆ๋งŒํผ๋งŒ ๋‹ค์Œ ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ด๋™์‹œ์ผœ์ฃผ์–ด ๋‘˜์ด ์›€์ง์ด๋Š” ๊ฐ„๊ฒฉ์„ ๋งž์ถฐ์ค˜์•ผ ํ•œ๋‹ค.

์ฃผ์š” ์ฝ”๋“œ

 while (!sangQ.isEmpty()){
    int firesize = fireQ.size();
    int sangsize = sangQ.size();
    
    for (int i = 0; i < firesize; i++){
        ... ์ƒ๋žต ...
    }

    for (int i = 0; i < sangsize; i++){
    	... ์ƒ๋žต ...
    }
โš ๏ธ for๋ฌธ์— ํ์˜ size๋ฅผ ๋„ฃ์–ด์ค„ ๋•Œ ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ..

๋ฐ˜๋ณต๋ฌธ ๋ฒ”์œ„์— ๋ฐ”๋กœ que.size() ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฐ˜๋ณต๋ฌธ์ด ์‹คํ–‰๋˜๋ฉด์„œ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜์—ฌ ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ž์ฃผ ํ‹€ใ„น๋ฆผ...ใ… 

 

๊ทธ ์™ธ ๋กœ์ง ์˜ค๋ฅ˜

1. ์ถœ๊ตฌ ํŒ๋ณ„ ์กฐ๊ฑด๋ฌธ

if (cr == 0 || cc == 0 || cr == h-1 || cc == w-1) { // ์ถœ๊ตฌ ํŒ๋ณ„
    System.out.println(sang[2]);
    return;
}

์ด ๋ถ€๋ถ„์„ ์‚ฌ๋ฐฉํƒ์ƒ‰ for ๋ฌธ ์•ˆ์— ์ž‘์„ฑํ•ด๋‘์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ˜๋ก€๊ฐ€ ์กด์žฌํ–ˆ๋‹ค.

.@
..

output 2
answer 1

 

 

์ „์ฒด ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main { // BOJ_5427_๋ถˆ

    static int[] dr = {-1, 1, 0, 0};
    static int[] dc = {0, 0, -1, 1};
    static char[][] map;
    static boolean[][] visited;
    static ArrayDeque<int[]> sangQ;
    static ArrayDeque<int[]> fireQ;

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

        int T = Integer.parseInt(br.readLine());
        for (int tc =0; tc<T; tc++){
            st = new StringTokenizer(br.readLine());
            int w = Integer.parseInt(st.nextToken()); // ์ง€๋„ ๋„ˆ๋น„ c
            int h = Integer.parseInt(st.nextToken()); // ์ง€๋„ ๋†’์ด r

            map = new char[h][w];
            visited = new boolean[h][w];

            sangQ = new ArrayDeque<>();
            fireQ = new ArrayDeque<>();

            for (int i = 0; i < h; i++){
                String str = br.readLine();
                for (int j = 0; j < w; j++){
                    char ch = str.charAt(j);
                    if (ch == '@'){
                        sangQ.add(new int[] {i, j, 1});
                    }
                    if (ch == '*'){
                        fireQ.add(new int[] {i, j});
                    }
                    map[i][j] = ch;
                }
            } // map end

            bfs(h, w);
        }
    }

    private static void bfs(int h, int w){
        while (!sangQ.isEmpty()){
            int firesize = fireQ.size();
            int sangsize = sangQ.size();
            for (int i = 0; i < firesize; i++){
                int[] fire = fireQ.poll();

                for (int d = 0; d < 4; d++){
                    int nr = fire[0] + dr[d];
                    int nc = fire[1] + dc[d];

                    if (nr < 0 || nc < 0 || nr >= h || nc >= w || map[nr][nc] == '#' || map[nr][nc] == '*') continue;

                    fireQ.add(new int[] {nr, nc});
                    map[nr][nc] = '*';
                }
            }

            for (int i = 0; i < sangsize; i++){
                int[] sang = sangQ.poll();
                int cr = sang[0];
                int cc = sang[1];
                if (cr == 0 || cc == 0 || cr == h-1 || cc == w-1) { // ์ถœ๊ตฌ ํŒ๋ณ„
                    System.out.println(sang[2]);
                    return;
                }
                for (int d = 0; d < 4; d++){
                    int nr = sang[0] + dr[d];
                    int nc = sang[1] + dc[d];

                    if (nr < 0 || nc < 0 || nr >= h || nc >= w || map[nr][nc] != '.' || visited[nr][nc]) continue;
                    sangQ.add(new int[] {nr, nc, sang[2]+1});
                    visited[nr][nc] = true;
                }
            }
        }
        System.out.println("IMPOSSIBLE");
    }
}