PS/Java

[SWEA] 1247. [S/W 문제해결 응용] 3일차 - 최적 경로

siyamaki 2021. 3. 13. 21:40

회사와 집의 좌표가 주어지고, 2명에서 10명 사이의 고객 좌표가 주어질 때,

회사에서 출발해서 이들을 모두 방문하고 집에 돌아가는 경로 중 총 이동거리가 가장 짧은 경로를 찾아라


import java.util.Scanner;

public class 최적경로 {
    static int[][] arr;
    static int[][] selectArr;
    static boolean[] selected;
    static int comX, comY, homeX, homeY, n, sum;
    static int min;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();

        for(int tc = 1; tc <= T; tc++) {
            n = scanner.nextInt();      // 고객 수
            arr = new int[n][2];            // 고객 집 저장
            selectArr = new int[n][2];
            min = Integer.MAX_VALUE;
            selected = new boolean[n];

            comX = scanner.nextInt();   // 회사 좌표
            comY = scanner.nextInt();

            homeX = scanner.nextInt();  // 집 좌표
            homeY = scanner.nextInt();

            for(int i = 0; i < n; i++) {
                arr[i][0] = scanner.nextInt();
                arr[i][1] = scanner.nextInt();
            }

            init(0);

            System.out.println("#" + tc + " " + min);

        }
    }

    // |x1-x2| + |y1-y2| 두 점 사이의 거리
    public static void init(int idx) {
        if(idx == n) {
            sum = 0;
            int k = selectArr.length;
            for (int i = 0; i < k; i++) {
                if(i == 0) {
                    sum += Math.abs(comX - selectArr[i][0]) + Math.abs(comY - selectArr[i][1]);
                } else {
                    sum += Math.abs(selectArr[i][0] - selectArr[i - 1][0]) + Math.abs(selectArr[i][1] - selectArr[i - 1][1]);
                }
            }
            sum += (Math.abs(homeX - selectArr[k - 1][0]) + Math.abs(homeY - selectArr[k - 1][1]));

            if(sum < min) {
                min = sum;
            }
            return;
        }
        for(int i = 0; i < n; i++) {
            if(!selected[i]) {
                selectArr[idx][0] = arr[i][0];  // 골라진넘 x좌표 저장
                selectArr[idx][1] = arr[i][1];  // 골라진넘 y좌표 저장

                selected[i] = true;
                init(idx + 1);
                selected[i] = false;
            }
        }
    }
}

 

완전탐색으로 해결했다.