영호

[백준] 불 5427 (Java) 본문

Algorithm/BFS

[백준] 불 5427 (Java)

0h0 2022. 10. 12. 17:17

문제 링크

https://www.acmicpc.net/problem/5427

나의 풀이

  • 기본적으로 최소시간을 구하는 문제라 BFS를 사용했습니다.
  • 그리고 문제를 '불이 옮겨진 칸 또는 이제 불이 붙으려는 칸으로 이동할 수 없다' 라는 문장이 있습니다. 즉, 불이 먼저 동서남북으로 한 칸씩 번지게 한 다음에 상근이가 동서남북으로 움직일 수 있는지 구별해야 합니다.

구현 기능

  • 불은 동서남북으로 한 칸씩 번져야 한다.
    • 단, 벽에는 불이 붙을 수 없다.
  • 상근이도 동서남북으로 한 칸씩 움직일 수 없다.
    • 역시 벽으로는 이동할 수 없고, 불이 붙으려는 칸으로 이동할 수 없다. -> 불을 먼저 번지게 함으로써 구별
  • 상근이가 x,y 좌표 중 하나라도 map의 가장자리에 도착하게 되면 탈출가능한 경우이다.

막혔던 점

  • sBfs()함수의 while문 바로 다음에 나오는 for문의 조건에 pSize가 아닌 person.size()를 바로 넣게 되면 해당 person.size가 계속 동적으로 변하는 걸 간과하고 코딩을 해서 25%에서 계속 틀렸습니다.
    • person은 상근이의 위치정보를 저장하는 Queue입니다.

Code

package bfs.boj_5427;

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

public class Main {
    static char[][] maps;

    static StringTokenizer st;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static int[] dx = new int[]{-1, 1, 0, 0};
    static int[] dy = new int[]{0, 0, 1, -1};
    static Queue<int[]> fireLocation;
    static Queue<Point> person;

    static int row;
    static int col;

    public static void main(String[] args) throws IOException {

        int testcases = Integer.parseInt(br.readLine());

        for (int i = 0; i < testcases; i++) {
            inputData();
        }
    }

    static void inputData() throws IOException {
        st = new StringTokenizer(br.readLine());

        col = Integer.parseInt(st.nextToken());
        row = Integer.parseInt(st.nextToken());

        maps = new char[row][col];


        fireLocation = new LinkedList<>();
        person = new LinkedList<>();

        for (int i = 0; i < row; i++) {
            maps[i] = br.readLine().toCharArray();
            for (int j = 0; j < col; j++) {
                if (maps[i][j] == '*') {

                    fireLocation.offer(new int[]{i,j});


                }
                if (maps[i][j] == '@') {
                    person.offer(new Point(i, j, 0));
                }
            }
        }

        int res = sBfs();
        if(res > 0){
            System.out.println(res);
        }
        else{
            System.out.println("IMPOSSIBLE");
        }
    }

    static void fireBfs() {
        int fires = fireLocation.size();

        for (int j = 0; j < fires; j++) {
            int[] poll = fireLocation.poll();
            int x = poll[0];
            int y = poll[1];


            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                if (0 <= nx && nx < row && 0 <= ny && ny < col) {
                    if (maps[nx][ny] == '.' || maps[nx][ny] == '@') {
                        fireLocation.offer(new int[]{nx,ny});
                        maps[nx][ny] = '*';
                    }
                }
            }
        }
    }

    static int sBfs() {
        while (!person.isEmpty()) {
            fireBfs();

//            person.stream().forEach(x -> System.out.print(x.toString()));
            int pSize = person.size();
            for (int k = 0; k < pSize; k++) {
                Point poll = person.poll();
                int x = poll.x;
                int y = poll.y;

                int dis = poll.dis;
                if (x == 0 || x == row - 1 || y == 0 || y == col - 1) {
                    return dis+1;
                }

                for (int i = 0; i < 4; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];

                    if (0 <= nx && nx < row && 0 <= ny && ny < col) {
                        if (maps[nx][ny] == '.') {
                            maps[nx][ny] = '@';
                            person.offer(new Point(nx,ny,dis+1));

                        }
                    }
                }
            }
        }
        return 0;

    }

    static class Point{
        int x;
        int y;
        int dis;

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

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

Git

https://github.com/youngh0/java-algorithm/blob/master/algorithm/src/main/java/bfs/boj_5427/Main.java

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

[백준] 1697 숨바꼭질 (Python)  (0) 2022.06.28
[백준] 토마토 7576 (Python)  (0) 2022.05.26
[백준] 경쟁적 전염 18405 (Python)  (0) 2022.05.24
[백준] 연구소 14502 (Python)  (0) 2022.05.12
Comments