๐ŸŒท๐ŸŒผ๋ชจ์—ฌ๋ด์š” ๊ฐœ๋ฐœ์˜์ˆฒ๐ŸŒท๐ŸŒผ

[JAVA/์ฝ”๋”ฉํ…Œ์ŠคํŠธ] ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ(์‚ผ์„ฑ SW์—ญ๋Ÿ‰ํ‰๊ฐ€ ๊ธฐ์ถœ๋ฌธ์ œ : DFSํ™œ์šฉ) ๋ณธ๋ฌธ

๊ฐœ๋ฐœ/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด JAVA

[JAVA/์ฝ”๋”ฉํ…Œ์ŠคํŠธ] ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ(์‚ผ์„ฑ SW์—ญ๋Ÿ‰ํ‰๊ฐ€ ๊ธฐ์ถœ๋ฌธ์ œ : DFSํ™œ์šฉ)

์š”์ผ์ด 2022. 3. 22. 22:55
๋ฐ˜์‘ํ˜•

์„ค๋ช…

N×N ํฌ๊ธฐ์˜ ๋„์‹œ์ง€๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์‹œ์ง€๋„๋Š” 1×1ํฌ๊ธฐ์˜ ๊ฒฉ์ž์นธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ๊ฒฉ์ž์นธ์—๋Š” 0์€ ๋นˆ์นธ, 1์€ ์ง‘, 2๋Š” ํ”ผ์ž์ง‘์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฒฉ์ž์นธ์€ ์ขŒํ‘œ(ํ–‰๋ฒˆํ˜ธ, ์—ด ๋ฒˆํ˜ธ)๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.

ํ–‰๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€์ด๊ณ , ์—ด ๋ฒˆํ˜ธ๋„ 1๋ถ€ํ„ฐ N๊นŒ์ง€์ž…๋‹ˆ๋‹ค.

๋„์‹œ์—๋Š” ๊ฐ ์ง‘๋งˆ๋‹ค “ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ”๊ฐ€ ์•˜๋Š”๋ฐ ๊ฐ ์ง‘์˜ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋Š” ํ•ด๋‹น ์ง‘๊ณผ ๋„์‹œ์˜ ์กด์žฌํ•˜๋Š”

ํ”ผ์ž์ง‘๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ํ•ด๋‹น ์ง‘์˜ “ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ”๋ผ๊ณ  ํ•œ๋‹ค.

์ง‘๊ณผ ํ”ผ์ž์ง‘์˜ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋Š” |x1-x2|+|y1-y2| ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋„์‹œ์˜ ์ง€๋„๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค๋ฉด

(1, 2)์— ์žˆ๋Š” ์ง‘๊ณผ (2, 3)์— ์žˆ๋Š” ํ”ผ์ž์ง‘๊ณผ์˜ ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ๋Š” |1-2| + |2-3| = 2๊ฐ€ ๋œ๋‹ค.

์ตœ๊ทผ ๋„์‹œ๊ฐ€ ๋ถˆ๊ฒฝ๊ธฐ์— ์ ‘์–ด๋“ค์–ด ์šฐํ›„์ฃฝ์ˆœ ์ƒ๊ฒผ๋˜ ํ”ผ์ž์ง‘๋“ค์ด ํŒŒ์‚ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์‹œ ์‹œ์žฅ์€ ๋„์‹œ์— ์žˆ๋Š” ํ”ผ์ž์ง‘ ์ค‘ M๊ฐœ๋งŒ ์‚ด๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ณด์กฐ๊ธˆ์„ ์ฃผ๊ณ  ํ์—…์‹œํ‚ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์žฅ์€ ์‚ด๋ฆฌ๊ณ ์ž ํ•˜๋Š” ํ”ผ์ž์ง‘ M๊ฐœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ๋„์‹œ์˜ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” M๊ฐœ์˜ ํ”ผ์ž์ง‘์„ ์„ ํƒํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋„์‹œ์˜ ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ๋Š” ๊ฐ ์ง‘๋“ค์˜ ํ”ผ์ž ๋ฐฐ๋‹ฌ ๊ฑฐ๋ฆฌ๋ฅผ ํ•ฉํ•œ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 12)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ ๋„์‹œ ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— M๊ฐœ์˜ ํ”ผ์ž์ง‘์ด ์„ ํƒ๋˜์—ˆ์„ ๋•Œ ๋„์‹œ์˜ ์ตœ์†Œ ํ”ผ์ž๋ฐฐ๋‹ฌ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์‹œ ์ž…๋ ฅ 1 

4 4
0 1 2 0
1 0 2 1
0 2 1 2
2 0 1 2

์˜ˆ์‹œ ์ถœ๋ ฅ 1

6

 

 

import java.util.*;

class Point{

    int x, y;

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

}

public class Main {

    static int n, m;
    static int[] dis;
    static ArrayList<Point> hs = new ArrayList<>();
    static ArrayList<Point> pz = new ArrayList<>();
    static int answer = Integer.MAX_VALUE;

    public void DFS(int L, int S){

        if(L == m){

            int sum = 0;

            for(int i=0; i<hs.size(); i++){

                int tmpSum = Integer.MAX_VALUE;

                for(int j=0; j<m; j++){
                    int tmp = Math.abs(hs.get(i).x - pz.get(dis[j]).x) + Math.abs(hs.get(i).y - pz.get(dis[j]).y);
                    tmpSum = Math.min(tmpSum, tmp);
                }

                sum += tmpSum;

            }

            answer = Math.min(answer, sum);

        }else{
            for(int i=S; i<pz.size(); i++){
                dis[L] = i;
                DFS(L+1, i+1);
            }
        }

    }

    public static void main(String[] args) {

        Main main = new Main();

        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){
                    hs.add(new Point(i, j));
                }else if(tmp == 2){
                    pz.add(new Point(i, j));
                }
            }
        }

        dis = new int[m];

        main.DFS(0,0);

        System.out.println(answer);

    }
}
Comments