Algorithm/SWEA

[swexpert] 1224. 최단 경로

반응형

[swexpert] 1224. 최단 경로


문제 출처 : 링크



최단 경로를 찾기 위해 순열을 활용하여 모든 경우를 진행해보고, 가장 경로가 짧은 값을 저장해야 한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
class pair {
    int y;
    int x;
    
    pair(int y, int x){
        this.y = y;
        this.x = x;
    }
}
 
public class Solution1247 {
 
    static pair company; // 회사(출발)
    static pair home; // 집(도착)
    static pair[] customer; // 손님
    static int ans; // 최소 경로
    
    public static int distance(pair p1, pair p2){ // 두 구간의 거리 구하는 메소드
        return Math.abs(p1.x - p2.x) + Math.abs(p1.y - p2.y);
    }
    
    public static void swap(int[] set, int i, int index) { // swap 메소드
        int temp = set[i];
        set[i] = set[index];
        set[index] = temp;
    }
    
    public static void perm(int[] set, int size, int n, int k) { // 순열 구하는 메소드
        if (size == k) { //종료조건
            int s = solve(set);
 
            ans = ans > s? s : ans; // 최소값 저장
            return;
        }
 
        for (int i = size; i < n; i++) {
            swap(set, i, size);
            perm(set, size + 1, n, k);
            swap(set, i, size);
        }
    }
    
    public static int solve(int[] set){
        int sum = 0// 거리를 저장할 sum
        
        sum += distance(company, customer[set[0]]); // 집과 첫번째 고객과의 거리
        
        for (int i = 0; i < set.length - 1; i++) { // 고객들간의 거리
            int index = set[i];
            int next = set[i+1];
            
            sum += distance(customer[index], customer[next]);
        }
        
        sum += distance(customer[set.length-1], home); // 마지막 고객과 집까지의 거리
        
        return sum;
    }
    
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int tc = Integer.parseInt(br.readLine()); // test case
        
        for (int t = 1; t <= tc; t++) {
            
            int N = Integer.parseInt(br.readLine()); // 고객 수
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            
            int y = Integer.parseInt(br.readLine());
            int x = Integer.parseInt(br.readLine());
            
            ans = Integer.MAX_VALUE;
            
            int[] set = new int[N];
            
            company = new pair(y, x); // 첫번째는 회사
            
            y = Integer.parseInt(br.readLine());
            x = Integer.parseInt(br.readLine());
            
            home = new pair(y, x); // 두번째는 집
            
            customer = new pair[N]; // customer 배열 생성
            
            for (int i = 0; i < N; i++) {
                y = Integer.parseInt(br.readLine());
                x = Integer.parseInt(br.readLine());
                
                customer[i] = new pair(y, x);
            }
            
            for (int i = 0; i < N; i++) { // 순열에 필요한 배열 초기값
                set[i] = i;
            }
            
            perm(set, 0, N, N); // N Perm N
            
            System.out.println("#" + tc + " " + ans);
        }
        
    }
 
}
cs


반응형

'Algorithm > SWEA' 카테고리의 다른 글

[swexpert 1494] 사랑의 카운슬러 (java)  (0) 2019.03.06
[swexpert 2819] 격자판의 숫자 이어 붙이기  (0) 2019.02.17
[swexpert] 1228. 암호문1  (0) 2019.01.29
[swexpert] 1210. Ladder1  (0) 2019.01.14
[swexpert] 1225. 암호생성기  (0) 2019.01.11