[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์™ธํŒ์› ๋ฌธ์ œ

์™ธํŒ์› ๋ฌธ์ œ๋ž€?


๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์ตœ์ ํ™” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋กœ Traveling Sales-man Problem (TSP)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์–ด๋–ค ๋‚˜๋ผ์— n(2<=n<=10)๊ฐœ์˜ ํฐ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ํ•œ ์˜์—… ์‚ฌ์›์ด ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด ๋‹ค๋ฅธ ๋„์‹œ๋“ค์„ ์ „๋ถ€ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•œ ๋’ค ์‹œ์ž‘ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋ ค๊ณ  ํ•œ๋‹ค.

์ด๋•Œ ๊ฐ ๋„์‹œ๋“ค์€ ๋ชจ๋‘ ์ง์„  ๋„๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์˜์—… ์‚ฌ์›์ด ์—ฌํ–‰ํ•ด์•ผ ํ•  ๊ฑฐ๋ฆฌ๋Š” ์–ด๋Š ์ˆœ์„œ๋กœ ๊ฐ ๋„์‹œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์ด๋•Œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ?

๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ


์‹œ์ž‘ํ•œ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ๊ฒฝ๋กœ์˜ ์‹œ์ž‘์ ์€ ์–ด๋–ค ์ ์œผ๋กœ ํ•˜๋“  ๊ฒฐ๊ณผ๋Š” ๋Š˜ ๊ฐ™๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋ฌด์‹ํ•˜๊ฒŒ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š” (n-1)! ๊ฐœ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ํƒ์ƒ‰ํ•ด์•ผ๋งŒ ํ•œ๋‹ค. n์ด ์ตœ๋Œ€ 10์ด ๋  ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ์ˆ˜๋Š” 9! ์ฆ‰, 362,880๊ฐœ๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์™„์ „ ํƒ์ƒ‰ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์žฌ๊ท€ํ˜ธ์ถœ ๋ฐฉ์‹


๊ฐ ์ ์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋„์‹œ๋Š” ์ด ์ž์‹ ์„ ์ œ์™ธํ•œ n-1๊ฐœ์˜ ๋„์‹œ์ด๋‹ค. ์ฆ‰, ์™„์ „ ํƒ์ƒ‰์„ ์œ„ํ•ด์„œ๋Š” ๊ฐ ์ ์—์„œ n-1๊ฐœ์˜ ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ฒฝ๋กœ์˜ distance๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„, ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 

n๊ฐœ์˜ ๋„์‹œ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฝ๋กœ๋ฅผ n๊ฐœ์˜ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ, ์žฌ๊ท€ํ˜ธ์ถœ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋œ๋‹ค. 

์ฝ”๋“œ


 

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
 
public class TSP {
    static int n = 5;
    static final int INF = 123456;
    static int dist[][] = {
            {0,3,4,5,6}, 
            {3,0,2,1,3}, 
            {4,2,0,4,3}, 
            {5,1,4,0,4}, 
            {6,3,3,4,0} };
        
 
    public static void main(String[] args) {
        LinkedList<Integer> path = new LinkedList<Integer>();
        boolean[] visited = {true,false,false,false,false};
        path.add(0);
        System.out.println(tsp(0, path, visited));
        
 
    }
    
    public static int tsp(int currentLength, LinkedList<Integer> path, boolean[] visited) {
        int ret = INF;
        
        if(path.size() == n) { // ๋‹ค์‹œ ์ถœ๋ฐœ์ง€๋กœ ๋ณต๊ท€
            return currentLength + dist[path.peekFirst()][path.peekLast()];  
        }
        
        for(int i=0; i<n; i++) {
            if(visited[i]) {
                continue;
            }
            int here = path.peekLast();
            path.add(i);
            visited[i] = true;
            int now = tsp(currentLength + dist[here][i], path, visited);
            if(ret > now) {
                ret = now;
            }
            path.pollLast();
            visited[i] = false;
        }
        
        
        return ret;
    }
 
}