말랑한 하루

[BAEKJOON] 2589 보물섬 (Java) 본문

문제풀이/BAEKJOON Online Judge

[BAEKJOON] 2589 보물섬 (Java)

지수는말랑이 2022. 10. 29. 19:08
반응형

[ 개요 ]
모든 육지를 시작으로, 다른 육지까지 갈 수 있는 거리 중 가장 큰 최대거리를 뽑아주면 된다.

[ 학습 내용 ]

※ 클래스 선언 (클래스 중복선언을 피하고자, 문제번호를 추가하였음)

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

[ 소스 코드 ]

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

class Pair_2589 {

  int y;
  int x;

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

class Data_2589 {

  Pair_2589 yx;
  int cnt;

  public Data_2589(Pair_2589 yx, int cnt) {
    this.yx = yx;
    this.cnt = cnt;
  }
}

public class 보물섬_2589 {

  public static final int MAX = 51;
  public static int H, W;
  public static char map[][] = new char[MAX][MAX];
  public static Queue<Pair_2589> land = new LinkedList<>();

  public static void init() throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    H = Integer.parseInt(st.nextToken());
    W = Integer.parseInt(st.nextToken());

    for (int i = 0; i < H; i++) {
      map[i] = br.readLine().toCharArray();
      for (int j = 0; j < W; j++) {
        if (map[i][j] == 'L') land.add(new Pair_2589(i, j));
      }
    }
  }

  public static int dy[] = { -1, 1, 0, 0 };
  public static int dx[] = { 0, 0, -1, 1 };

  public static int treasureIsland() {
    int high = -1;
    while (!land.isEmpty()) {
      Queue<Data_2589> island = new LinkedList<>();
      Pair_2589 point = land.poll();
      island.add(new Data_2589(point, 0));

      boolean check[][] = new boolean[H][W];
      for (boolean item[] : check) {
        Arrays.fill(item, false);
      }
      check[point.y][point.x] = true;

      while (!island.isEmpty()) {
        Data_2589 out = island.poll();
        high = high > out.cnt ? high : out.cnt;
        for (int i = 0; i < 4; i++) {
          int ny = out.yx.y + dy[i];
          int nx = out.yx.x + dx[i];
          int nc = out.cnt + 1;
          if (!range(ny, nx) && !check[ny][nx] && map[ny][nx] == 'L') {
            check[ny][nx] = true;
            island.add(new Data_2589(new Pair_2589(ny, nx), nc));
          }
        }
      }
    }
    return high;
  }

  public static boolean range(int y, int x) {
    return y < 0 || x < 0 || y > H - 1 || x > W - 1;
  }

  public static void main(String[] args) throws IOException {
    init();
    System.out.println(treasureIsland());
  }
}
반응형
Comments