알고리즘/백준
2589_보물섬
베리영young
2025. 2. 4. 00:24
사용 알고리즘: bfs? 다익스트라?
사용 언어: java
package week34;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main_bj_2589_보물섬 {
static int n,m, map[][], answer, DP[][];
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
public static void main(String[] args) throws IOException {
init_2589();
boolean[][] bf = new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if(map[i][j]==1 && !bf[i][j]) {
bf[i][j] = true;
bfs_2589(i, j);
}
}
}
System.out.println(answer);
}
private static void bfs_2589(int x, int y) {
int[][] dp = new int[n][m];
for (int i = 0; i < n; i++) {
Arrays.fill(dp[i], Integer.MAX_VALUE);
}
dp[x][y] = 0;
Queue<int[]> q = new ArrayDeque<>();
q.add(new int[] {x, y, 0});
while(!q.isEmpty()) {
int[] p = q.poll();
for (int d = 0; d < 4; d++) {
int nx = p[0] + dx[d];
int ny = p[1] + dy[d];
if(inMap(nx, ny) && dp[nx][ny] > p[2]+1 && map[nx][ny]==1) {
dp[nx][ny] = p[2]+1;
q.add(new int[] {nx, ny, p[2]+1});
}
}
}
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < m; j++) {
if(dp[i][j]!=Integer.MAX_VALUE && dp[i][j] > answer) answer = dp[i][j];
}
}
}
private static void init_2589() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
map = new int[n][m];
// DP = new int[n][m]; //큰 수로 갱신.!
for (int i = 0; i < n; i++) {
String s = br.readLine();
for (int j = 0; j < m; j++) {
if(s.charAt(j) == 'L')
map[i][j] = 1;
}
}
}
private static boolean inMap(int x, int y) {
if(x>=0&&x<n && y>=0&&y<m) return true;
return false;
}
}
문제가 참 이해하기 어렵게 쓰여 있다ㅎㅎ...
결국 같은 덩어리에 있는 육지(L) 중에서, 가장 멀리 떨어져 있는 거리를 구하라는 것이다..
어디가 육지의 끝인지 알 수 없기 때문에
각 지점마다 bfs를 돌려서, 가장 멀리 있는 곳을 찾으면 되겠다고 생각했다.
그래서 bfs를 돌릴 때마다 dp를 새로 만들어서, dp 값 중 가장 큰 값으로 갱신한다.
(dp를 int의 최대값으로 설정했기 때문에, 당연히 dp[i][j]가 int의 최대값이 아닐 때만 값을 비교해서 갱신한다)