ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 1247. [S/W 문제해결 응용] 3일차 - 최적 경로
    PS/Java 2021. 3. 13.

    회사와 집의 좌표가 주어지고, 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;
                }
            }
        }
    }
    

     

    완전탐색으로 해결했다.

    'PS > Java' 카테고리의 다른 글

    [SWEA] 9229. 한빈이와 Spot Mart  (0) 2021.03.13
    [SWEA] 3499. 퍼펙트 셔플  (0) 2021.03.13
    [SWEA] 1860. 진기의 최고급 붕어빵  (0) 2021.03.13
    [SWEA] 2063. 중간값 찾기  (0) 2021.03.13
    [SWEA] 1861. 정사각형 방  (0) 2021.03.10

    댓글

Designed by Tistory.