본문 바로가기
Algorithm

[백준 Gold 5] 2589 보물섬 - Java

by Ray 2021. 12. 29.

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

 

2589번: 보물섬

보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서

www.acmicpc.net

 

접근 과정 : 

  • 임의의 육지 2개를 고르고, 그 사이의 최단거리가 가장 긴 거리를 탐색하는 문제이다.
  • 육지 하나하나 모두 BFS 해서 최장 거리를 탐색하는 완전탐색 방법으로 풀이할 수 있다.

 

  • ++ 한 번 거리가 측정된 경로는 다시 탐색하지 않고 사용하는 것이 시간을 줄일 수 있는 포인트..
  • 이 부분에 대해서는 좀 더 고민이 필요하다.

 

소스 코드 및 결과 :

 

package BOJ;

/* 
    보물섬
*/

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

public class BOJ2589 {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

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

        map = new char[R][C];

        for (int i = 0; i < R; i++) {
            map[i] = br.readLine().toCharArray();
        }

        distance = 0;
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == 'L') {
                    distance = Math.max(distance, BFS(i, j));
                }
            }
        }

        System.out.println(distance);

    }

    static int R, C, distance;
    static char[][] map;
    static int[][] visit;
    static int[][] move = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };

    static int BFS(int r, int c) {

        visit = new int[R][C];

        int d = 0;

        Queue<int[]> queue = new LinkedList<>();
        queue.add(new int[] { r, c });
        visit[r][c] = 1;

        while (!queue.isEmpty()) {
            int[] now = queue.poll();

            d = Math.max(d, visit[now[0]][now[1]]);

            for (int i = 0; i < 4; i++) {
                int nr = now[0] + move[i][0];
                int nc = now[1] + move[i][1];

                if (nr < 0 || nr >= R || nc < 0 || nc >= C) {
                    continue;
                }

                if (map[nr][nc] == 'W' || visit[nr][nc] != 0) {
                    continue;
                }

                visit[nr][nc] = visit[now[0]][now[1]] + 1;
                queue.add(new int[] { nr, nc });

            }
        }

        return d-1;
    }

}

 

P.S 

다른 백준 코드를 보니, 확실히 시간이 짧은 코드들이 여럿 있더라..

근데 나는 아직 그렇게는 못 풀것 같다..

해당 문제에 대해서는 좀 더 고민이 필요하다.