본문 바로가기
알고리즘 문제 풀이/완전탐색

백준 - 보물섬

by 가나무마 2022. 1. 26.
728x90

본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.

https://github.com/ROUTINE-STUDY/Algorithm

 

저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.

 

GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능

초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.

github.com

문의는 댓글 바람.

 

문제 출처 :https://www.acmicpc.net/problem/2589

 

2589번: 보물섬

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

www.acmicpc.net

 

[문제 설명]

육지에서 가장 먼 두 곳이 보물이 있는 곳이다. 보물의 거리를 구하시오.

 

[접근 방법]

모든 육지를 완전탐색으로 찾고, 그 지점에서 주변을 BFS한다.

완전탐색 O(N^2)

BFS O(N+4*N) => 모든 정점의 개수 + 모든 간선의 개수 => 정점의 개수 최대 50 + 모든 간선의 개수(모든 정점 개수*4방향) => 250

 

총 시간복잡도는 O(N^3)이 될 듯하다.

 

 

[Java 코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int width;
    static int height;
    static char[][] map;
    static int[][] directions = {{-1,0},{0,1},{1,0},{0,-1}};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        height = Integer.parseInt(st.nextToken());
        width = Integer.parseInt(st.nextToken());
        map = new char[height][width];
        for (int i = 0; i < height; i++) {
            map[i] = br.readLine().toCharArray();
        }

        int distance = Integer.MIN_VALUE;
        for (int idxOfHeight = 0; idxOfHeight < height; idxOfHeight++) {
            for (int idxOfWidth = 0; idxOfWidth < width; idxOfWidth++) {
                if (map[idxOfHeight][idxOfWidth] == 'L') {
                    boolean[][] isVisited = new boolean[height][width];
                    distance = Math.max(distance, bfs(isVisited, idxOfHeight, idxOfWidth));
                }
            }
        }
        System.out.println(distance);
    }

    private static int bfs(boolean[][] isVisited, int idxOfHeight, int idxOfWidth) {
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{idxOfHeight, idxOfWidth});
        int distance = -1;
        while (!q.isEmpty()) {
            int cntOfSameDepth = q.size();

            for (int i = 0; i < cntOfSameDepth; i++) {
                int[] currentLocation = q.poll();
                isVisited[currentLocation[0]][currentLocation[1]] = true;
                for (int[] direction : directions) {
                    int[] nextLocation = new int[]{currentLocation[0] + direction[0], currentLocation[1]+direction[1]};
                    if (0 <= nextLocation[0] && nextLocation[0] < height && 0 <= nextLocation[1] && nextLocation[1] < width) {
                        if (isVisited[nextLocation[0]][nextLocation[1]]) {
                            continue;
                        }
                        if (map[nextLocation[0]][nextLocation[1]] == 'L') {
                            q.offer(nextLocation);
                            isVisited[nextLocation[0]][nextLocation[1]] = true;
                        }
                    }
                }
            }
            distance++;
        }
        return distance;
    }

}

 

728x90
반응형