inblog logo
|
LHS's Study Space
    알고리즘문제풀기랜덤마라톤

    [랜덤 마라톤] 보물섬(2589)

    lhs's avatar
    lhs
    Nov 24, 2024
    [랜덤 마라톤] 보물섬(2589)
    Contents
    1. 문제 풀이 아이디어2. 나의 정답 코드3. 정리
    www.acmicpc.net
    https://www.acmicpc.net/problem/2589
    notion image
    notion image

    1. 문제 풀이 아이디어

    • 모든 지역에 대해 BFS를 사용해 각 지역에서의 최대 거리를 구하고, 그 최대값을 찾아 문제를 해결할 수 있다.

    2. 나의 정답 코드

    public class Main { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); int n = Integer.parseInt(stringTokenizer.nextToken()); int m = Integer.parseInt(stringTokenizer.nextToken()); boolean[][] map = new boolean[n][m]; int result = 0; for (int i = 0; i < n; i++) { String line = bufferedReader.readLine(); for (int j = 0; j < m; j++) { map[i][j] = line.charAt(j) == 'L'; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (!map[i][j]) continue; boolean[][] chk = new boolean[n][m]; chk[i][j] = true; Queue<int[]> que = new ArrayDeque<>(); que.add(new int[]{i, j}); int dist = -1; while (!que.isEmpty()) { int size = que.size(); dist++; for (int k = 0; k < size; k++) { int[] cur = que.poll(); for (int l = 0; l < dir.length; l++) { int x = cur[0] + dir[l][0]; int y = cur[1] + dir[l][1]; if (x < 0 || x >= n || y < 0 || y >= m || chk[x][y] || !map[x][y]) continue; chk[x][y] = true; que.add(new int[]{x, y}); } } } result = Math.max(result, dist); } } System.out.println(result); bufferedReader.close(); } }

    3. 정리

    • 입력을 받아 map 배열에 육지(L)일 경우 true로 저장한다.
    • 전체 map 배열을 순회하며 육지인 위치(true)에서 BFS를 시작한다.
    • BFS에서는 현재 위치를 que에 넣고, 방문 여부를 체크하기 위해 chk 배열을 사용한다.
    • que가 빌 때까지, 현재 que의 크기만큼 반복하면서 주변 이동 가능한 위치를 탐색해 que에 추가한다.
    • 각 BFS의 최대 거리를 dist로 계산하여 result와 비교해 더 큰 값을 저장한다.
    • 모든 BFS가 끝난 후, result를 출력하여 문제를 해결한다.
    Share article

    LHS's Study Space

    RSS·Powered by Inblog