๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[์ธํ”„๋Ÿฐ/DFS/ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ]

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2024. 12. 8.

์˜ค๋Š˜์€ ์กฐํ•ฉ ๋ฌธ์ œ๋กœ์„œ DFS๋ฅผ ํ™œ์šฉํ•ด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“ค์–ด ํ’€์–ด๋ณด์•˜๋‹ค.

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋ฌธ์ œ์˜ ๋ง์ด ํ—ท๊ฐˆ๋ฆฌ ์ˆ˜๋„ ์žˆ๊ณ  ๋…ผ๋ž€์˜ ์†Œ์ง€๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ดˆ์ ์„ ๋‘๊ณ  ๋ฐฐ์› ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ํ’€์–ด๋ณด์•˜๋‹ค.

 

 

<<ํ’€์ด>>

 

import java.util.ArrayList;
import java.util.Scanner;

class Point {
    int x;
    int y;

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



class Main {

    static int answer = Integer.MAX_VALUE;
    static ArrayList<Point> house, pizza;
    static int n, m, len;
    static int[] combi;


    private void DFS(int L, int s) {
        if (L == m) {
            int sum = 0;
            for (Point h : house) {
                int dis = Integer.MAX_VALUE;
                for (int i : combi) {
                    dis = Math.min(dis, Math.abs(h.x - pizza.get(i).x) + Math.abs(h.y - pizza.get(i).y));
                }
                sum += dis;
            }
            answer = Math.min(answer, sum);
        }
        else {
            for (int i = s; i < len; i++) {
                combi[L] = i;
                DFS(L+1, i+1);
            }
        }
    }



    public static void main(String[] args){
        Main T = new Main();
        house = new ArrayList<>();
        pizza = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();


        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int tmp = in.nextInt();
                if (tmp == 1) house.add(new Point(i, j));
                else if (tmp == 2) pizza.add(new Point(i, j));
            }
        }
        len = pizza.size();
        combi = new int[m];
        T.DFS(0, 0);
        System.out.println(answer);

    }
}

 

 

<๋ฌธ์ œ์˜ ํ•ต์‹ฌ>

 

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ ์กฐํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ๊ณ  ์žˆ๋А๋ƒ? ์ด๋‹ค.

 

๊ทธ๊ฒƒ ์™ธ์—๋Š” ์ •๋ง ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

์šฐ์„  ArrayList์— ์ง‘๊ณผ ํ”ผ์ž ์ง‘์„ ๋„ฃ์–ด๋‘”๋‹ค.

 

๊ฑฐ๊ธฐ์„œ ์กฐํ•ฉ์„ ๊ตฌํ•˜์—ฌ ์กฐํ•ฉ ๊ฒฝ์šฐ์˜ ์ˆ˜ ํ™œ์šฉํ•œ๋‹ค. ์ด๋•Œ DFS ์„ฑ์งˆ์„ ์ด์šฉํ•œ๋‹ค.

 

 

DFS ์„ฑ์งˆ

    private void DFS(int L, int s) {
        if (L == m) {

            for(int x : combi) System.out.print(x + " ");
            System.out.println();
//            int sum = 0;
//            for (Point h : house) {
//                int dis = Integer.MAX_VALUE;
//                for (int i : combi) {
//                    dis = Math.min(dis, Math.abs(h.x - pizza.get(i).x) + Math.abs(h.y - pizza.get(i).y));
//                }
//                sum += dis;
//            }
//            answer = Math.min(answer, sum);
        }
        else {
            for (int i = s; i < len; i++) {
                combi[L] = i;
                DFS(L+1, i+1);
            }
        }
    }

 

์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์ด ์กฐํ•ฉ์—์„œ์˜ DFS๋Š” L๊ณผ s๋ฅผ ํ™œ์šฉํ•ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.

 

์ด๋•Œ L ์€ ๋ฝ‘๊ณ ์žํ•˜๋Š” ๊ฐฏ์ˆ˜์˜ ์ธ๋ฑ์Šค์ด๊ณ 

s๋Š” ์‹œ์ž‘์ ์ด๋ผ๊ณ  ๋ณด๋ฉด๋œ๋‹ค. 

 

์ด ์กฐํ•ฉ์˜ DFS์˜ ํ˜•ํƒœ๋Š” ์•”๊ธฐํ•ด ๋‘๊ณ  ๋‘๊ณ ๋‘๊ณ  ์‚ฌ์šฉํ•˜์ž.

 

ํ•œ ๋ฒˆ ๋” ํ’€์–ด๋ณด๋ฉด์„œ ๋”์šฑ ์ž˜ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์Šตํ•ด๋ณด์ž

๋Œ“๊ธ€