Algorithm

[백준 Gold 4] 3055 탈출 - Java

Ray 2021. 12. 18. 19:21

문제링크 : https://www.acmicpc.net/problem/3055

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net

 

접근 과정 : 

  • 일반적인 BFS 방식으로 접근
  • 물이 찰 공간으로 고슴도치가 이동할 수 없다.
  • 시간++ -> 물 이동 -> 고슴도치 이동 순으로 반복해서 가장 빠른 시간을 탐색
  • 만약 고슴도치가 더 이상 이동할 수 없다면, 비버의 집에 갈 수 없다!!

 

소스 코드 및 결과 : 

package BOJ;

/* 
    탈출 
*/

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

public class BOJ3055 {

    static int[][] move = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } };

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int R = Integer.parseInt(st.nextToken());
        int C = Integer.parseInt(st.nextToken());

        char[][] forest = new char[R][C];

        Queue<int[]> hedgehog = new LinkedList<>();
        Queue<int[]> water = new LinkedList<>();
        boolean[][] visit = new boolean[R][C];

        for (int i = 0; i < R; i++) {
            String input = br.readLine();
            for (int j = 0; j < C; j++) {
                forest[i][j] = input.charAt(j);

                if (input.charAt(j) == 'S') {
                    hedgehog.add(new int[] { i, j });
                    forest[i][j] = '.';
                    visit[i][j] = true;

                } else if (input.charAt(j) == '*') {
                    water.add(new int[] { i, j });
                }

            }
        }

        int count = 0;

        while (!hedgehog.isEmpty()) {

            count++;

            // 물 이동
            int size = water.size();
            while (size-- > 0) {

                int[] w = water.poll();

                for (int i = 0; i < 4; i++) {
                    int wr = w[0] + move[i][0];
                    int wc = w[1] + move[i][1];

                    if (wr < 0 || wr >= R || wc < 0 || wc >= C || forest[wr][wc] != '.') {
                        continue;
                    }

                    forest[wr][wc] = '*';
                    water.add(new int[] { wr, wc });
                }
            }

            // 고슴도치 이동
            size = hedgehog.size();
            while (size-- > 0) {

                int[] h = hedgehog.poll();

                for (int i = 0; i < 4; i++) {
                    int hr = h[0] + move[i][0];
                    int hc = h[1] + move[i][1];

                    if (hr < 0 || hr >= R || hc < 0 || hc >= C || visit[hr][hc] || forest[hr][hc] == '*'
                            || forest[hr][hc] == 'X') {
                        continue;
                    }

                    if (forest[hr][hc] == 'D') {
                        System.out.println(count);
                        return;
                    }

                    visit[hr][hc] = true;
                    hedgehog.add(new int[] { hr, hc });

                }
            }

        }

        System.out.println("KAKTUS");

    }

}

 

 

P.S

물이 없는 경우가 존재하나 봄

티떡숲에 홍수를 일으킨다는데..., 티떡숲 지도에 물이 주어지지 않다니...