본문 바로가기

알고리즘/문제 풀이

💜 2589 보물섬

목차
1. 문제 설명
2. 내가 푼 방법
3. 코드 분석 

1. 문제 설명

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

 

2589번: 보물섬

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

www.acmicpc.net

육지하고 바다가 있는데, 해적은 육지로만 갈 수 있다. 
육지는 인접할 수 있고, 해적은 대각선을 제외한 사방으로만 움직일 수 있다. 
보물은 해적이 걸어서 갈 수 있는 육지 안에 가장 거리가 긴 육지노드에 각각 존재하는데, 이때, 보물 2개를 찾는 최단 거리를 구하시오. 

 

2. 문제 푼 원리 설명 

2차원 배열을 돌면서 육지를 만나면 거기서부터 인접한 노드를 돌면서 해당 육지는 거리가 얼마나 먼지 BFS로 체크, 거기서 육지간의 거리가 가장 긴 경우에 그 거리를 찾아서 출력하면 된다.

 

 3. 코드 분석 

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

public class Main {

    static int W,H;

    // 육지(L) == 0, 바다(W) == -1, 나머지 값 == 시작점으로부터 걸린 횟수
    static int [][] land;

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

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


        // 0. 입력 받기
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        ArrayList<Integer> HourList = new ArrayList<>();

        W = Integer.parseInt(st.nextToken());
        H = Integer.parseInt(st.nextToken());

        land = new int[W][H];

        for (int i = 0; i < W; i++) {
            String s = br.readLine();
            for (int j = 0; j < H; j++) {
                if(s.charAt(j) == 'W'){
                    land[i][j] = -1; // 바다
                } else if (s.charAt(j) == 'L') {
                    land[i][j] = 0; // 육지
                }
            }
        }

        for (int i = 0; i < W; i++) {
            for (int j = 0; j < H; j++) {
                if(land[i][j] == 0){
                    HourList.add(BFS(i,j));
                }
            }
        }

        Collections.sort(HourList);
        System.out.println(HourList.get(HourList.size()-1));

    }

    // 육지인 경우에만 값이 들어온다.
    static int BFS(int x, int y) {

        int moveCnt = 0;
        land[x][y] = -999;
        ArrayDeque<Coordinate1> aq1 = new ArrayDeque<>();
        aq1.add(new Coordinate1(x,y));


        while(!aq1.isEmpty()){
            // 한 턴에 +1씩 moveCnt를 올린다.
            moveCnt ++;
            int Qsize = aq1.size();
            for (int k = 0; k < Qsize; k++) {
                Coordinate1 now = aq1.poll();

                for (int i = 0; i < 4; i++) {
                    int nx = now.x + idx[i];
                    int ny = now.y + idy[i];

                    // (1) 그래프 안에 포함되고
                    if(nx >=0 && ny >= 0 && nx < W && ny < H){
                        // (2) 바다가 아니라면
                        if(land[nx][ny] == 0){
                            land[nx][ny] = moveCnt;
                            aq1.add(new Coordinate1(nx,ny));
                        }
                    }
                }
            }

        }
        // BFS 검사로 더럽혀진 배열을 깨끗하게 돌려놓는다.
        for (int i = 0; i < W; i++) {
            for (int j = 0; j < H; j++) {
                if(land[i][j] != 0 && land[i][j] !=-1){
                    land[i][j] = 0;
                }
            }
        }


        // 이 BFS가 끝나고 나면 moveCnt에는 최장 moveCnt가 남는다.
        return moveCnt-1;
    }

}

class Coordinate1 {
    int x;
    int y;

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

 

'알고리즘 > 문제 풀이' 카테고리의 다른 글

💚 5430 AC JAVA  (0) 2024.03.09
💔 14889. 스타트와 링크  (0) 2024.03.08
💜 2667번 단지 번호 붙이기 JAVA  (0) 2024.03.02
💜 2606 바이러스 JAVA  (0) 2024.02.29
💔 9663 N-Queen java  (0) 2024.01.11