문제 링크

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

문제 풀이

보물 지도가 주어질 때, 보물이 묻혀 있는 두 곳 간의 최단 거리로 이동하는 시간을 구하는 문제이다.

 

최단 거리에 대한 조건은 최단 거리로 이동하는데 있어 가장 긴 시간이 걸리는 육지 두 곳이라고 명시되어 있다.

이 말은 최단 거리들 중에서 가장 시간이 오래 걸리는 두 점을 찾으라는 말이며 위치로 본다면 최단 거리들 중에서 가장 먼 거리를 구하라는 말이다.

 

문제에서 최단 거리들 중에서 가장 시간이 오래 걸린다는 말은 두 점 간의 최단 거리는 여러 개가 존재할 수 있고 그 중에서 가장 거리가 먼 두 점을 찾으라는 말로 해석하면 된다.

 

예시

그림을 통해 지도 내 존재하는 어떤 한 점에서 다른 점까지의 최단 거리들의 존재를 확인할 수 있다.

 

파란색 점들은 시작 점에서 이동할 수 있는 지점들이며 그 중에 최대한 먼 거리가 또 다른 주황색 점이다.

코드

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 {
    private static int rowSize;
    private static int colSize;
    private static int[][] map;
    private static int[] dx = new int[]{0, 0, 1, -1};
    private static int[] dy = new int[]{1, -1, 0, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        rowSize = Integer.parseInt(st.nextToken());
        colSize = Integer.parseInt(st.nextToken());
        map = new int[rowSize][colSize];

        for (int i = 0; i < rowSize; i++) {
            String[] row = br.readLine().split("");
            for (int j = 0; j < colSize; j++) {
                String value = row[j];
                if (value.equals("L")) {
                    map[i][j] = 1;
                }
            }
        }
        int answer = 0;
        for (int i = 0; i < rowSize; i++) {
            for (int j = 0; j < colSize; j++) {
                if (map[i][j] == 1) {
                    boolean[][] visited = new boolean[rowSize][colSize];
                    int maxDistance = search(i, j, visited);
                    answer = Math.max(maxDistance, answer);
                }
            }
        }
        System.out.println(answer);
        br.close();
    }

    public static int search(int row, int col, boolean[][] visited) {
        Queue<Coordinate> queue = new LinkedList<>();
        queue.offer(new Coordinate(row, col,0));
        visited[row][col] = true;
        int maxDist = 0;
        while (!queue.isEmpty()) {
            Coordinate current = queue.poll();

            if(maxDist < current.getDist()){
                maxDist = current.getDist();
            }
            for (int i = 0; i < 4; i++) {
                int nRow = current.getRow() + dx[i];
                int nCol = current.getCol() + dy[i];

                if(isIn(nRow, nCol) && map[nRow][nCol]==1 && !visited[nRow][nCol] ){
                    visited[nRow][nCol] = true;
                    queue.offer(new Coordinate(nRow, nCol, current.getDist()+1));
                }
            }
        }
        return maxDist;
    }

    private static boolean isIn(int row, int col) {
        return (0 <= row && row < rowSize) && (0 <= col && col < colSize);
    }
}

class Coordinate {
    private final int row;
    private final int col;
    private final int dist;
    public Coordinate(int row, int col, int dist) {
        this.row = row;
        this.col = col;
        this.dist = dist;
    }

    public int getRow() {
        return row;
    }

    public int getCol() {
        return col;
    }

    public int getDist() {
        return dist;
    }

'코딩테스트 > boj' 카테고리의 다른 글

줄어들지 않아 - 백준 2688  (0) 2024.05.22
떡 먹는 호랑이 - 백준 2502 자바  (0) 2024.05.22
별 찍기 11 - 2448  (0) 2024.03.30
벽 부수고 이동하기 - 백준 2206  (0) 2024.03.30
램프 - 백준 1034  (0) 2024.03.07

+ Recent posts