알고리즘/백준

[백준] 28215: 대피소 (JAVA)

김호록님 2025. 4. 7. 20:47

 

 

풀이

너무 오랜만에 접한 알고리즘 문제 + 긴 지문으로 인해 시간이 좀 오래 걸렸다 .. 

문제가 좀 헷갈리고 복잡해서 그렇지 사실 dfs를 적용할 수 있으면 간단하게 풀 수 있을 문제였다.

 

정답 코드

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

public class Main {
    static int N, K;
    static int[][] arr;
    static int minMaxDist = Integer.MAX_VALUE; // 가장 큰 거리값이 가장 작을 때의 거리
    static int[] selected; // 선택된 인덱스 저장 배열

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); // 전체 집 개수
        K = Integer.parseInt(st.nextToken()); // 대피소 설치할 집 개수

        arr = new int[N][2];
        selected = new int[K];

        for (int i = 0; i < N; i++) { // 배열에 저장
            st = new StringTokenizer(br.readLine());
            arr[i][0] = Integer.parseInt(st.nextToken());
            arr[i][1] = Integer.parseInt(st.nextToken());
        }

        dfs(0,0);
        System.out.println(minMaxDist);

    }

    static void dfs(int idx, int depth) { // 조합 구하기
        if (depth == K) {
            int maxDist = 0;
            for (int i = 0; i < N; i++) {
                int minDist = Integer.MAX_VALUE; // 가장 가까운 대피소

                for (int j = 0; j < K; j++) {
                    int shelterIdx = selected[j];
                    int dist = Math.abs(arr[i][0] - arr[shelterIdx][0]) + Math.abs(arr[i][1] - arr[shelterIdx][1]);
                    minDist = Math.min(minDist, dist); // 가장 가까운 대피소 거리
                }
                maxDist = Math.max(maxDist, minDist); // 그 중 가장 먼 집
            }
            minMaxDist = Math.min(minMaxDist, maxDist); // 그 중 가장 작은 최대 거리
            return;
        }

        for (int i = idx; i < N; i++) {
            selected[depth] = i;
            dfs(i + 1, depth + 1);
        }
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1717: 집합의 표현 (JAVA)  (0) 2024.10.11
[백준] 10974: 모든 순열 (JAVA)  (0) 2024.10.08
[백준] 10026: 적록색약 (JAVA)  (0) 2024.10.06
[백준] 21921: 블로그 (JAVA)  (1) 2024.09.28
[백준] 1238: 파티 (JAVA)  (1) 2024.09.25