PS

[백준] 15686번 : 치킨 배달[Java]

devkdh 2025. 7. 12. 20:25

 

#풀이

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

public class Main {
    static int M;
    static ArrayList<int[]> home = new ArrayList<>();
    static ArrayList<int[]> chicken = new ArrayList<>();
    static ArrayList<int[]> chickenList = new ArrayList<>();
    static boolean[] visited;
    static int ans = Integer.MAX_VALUE;
    static void dfs(int start, int depth){

        if(depth==M) {
            int sum = 0;
            //해당 조합에 대해 최소 치킨 거리 구하기
            for (int j = 0; j < home.size(); j++) {
                int min = Integer.MAX_VALUE;
                for (int k = 0; k < chickenList.size(); k++) {
                    int dis = Math.abs(home.get(j)[0] - chickenList.get(k)[0]) + Math.abs(home.get(j)[1] - chickenList.get(k)[1]);
                    if (dis < min) min = dis;
                }
                sum += min;

            }
            if (sum < ans) ans = sum;
            return;
        }
        for(int i = start; i<chicken.size(); i++){
            if(!visited[i]){
                visited[i] = true;
                chickenList.add(chicken.get(i));
                dfs(i+1,depth+1);
                chickenList.remove(chickenList.size() - 1);
                visited[i] = false;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        int input;
        for(int i = 0; i<N; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0; j<N; j++){
                input = Integer.parseInt(st.nextToken());
                if(input==1){

                    home.add(new int[]{i,j});
                }
                else if(input==2){
                    chicken.add(new int[]{i,j});
                }

            }
        }
        visited = new boolean[chicken.size()];
        dfs(0,0);
        System.out.println(ans);

    }
}

#성능

#정리

백트래킹 문제이다.

먼저 치킨집에 대한 모든 조합을 생성하고 모든 조합에 대해서 가장 작은 치킨 거리를 갖는 값을 출력한다.

 

처음에는 각 조합에 대해서 bfs로 치킨거리를 구하려 했으나 좌표가 이미 주어졌기에 그럴 필요가 없다는 것을 알았다.