티스토리 뷰
1) 생각
도시들과 그 도시들간 이동할 때 발생하는 비용이 주어졌을 때, 외판원이 한 곳에서 출발해서 모든 도시를 돌고 다시 돌아왔을 때 최소의 비용을 구하라는 문제로 그리디적으로 접근 할 수도 있겠지만 항상 정답을 보장하는 것이 아니고 10개의 도시가 최대이므로 완전 탐색을 이용해서 답을 구해보았다.
2) 방안
한 번 방문한 도시는 출발할 때의 도시를 제외하고는 다시 방문해서는 안되므로 방문을 체크하는 배열을 만들고, DFS로 도시들을 방문하면서 방문한 도시를 방문체크 한 뒤 탐색을 진행한다.
이 때, Count 변수인 cnt의 체크와 함께 처음 시작한 곳으로 다시 돌아와주었는지도 체크함으로써 모든 곳을 방문하였는가가 아닌 순회를 하였는가를 체크해주었다.
이동하는 비용이 정해지면 이동중에 비용이 작아지는 경우는 없으므로 현재 최소 비용보다 크다면 그 방향의 탐색은 진행하지 않으므로써 시간을 줄였다.
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.SocketTimeoutException; import java.util.StringTokenizer; public class Main{ static int n; static int[][] arr; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); arr = new int[n][n]; for(int i=0;i<n;i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for(int j=0;j<n;j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } visited = new boolean[n]; for(int i=0;i<n;i++) { start = i; solve(i,i,0,0); } System.out.println(min); } static int min = Integer.MAX_VALUE; static int start = 0; static boolean[] visited; private static void solve(int x,int y, int cnt,int sum) { if(cnt==n&&start==y) { min = Math.min(min, sum); return; } // 도착한 y에서 이동 for(int i=0;i<n;i++) { if(visited[i]) continue; // y->i로 갈 수 없는 경우 0값을 가지고있다. // 따라서 y==i 일 경우만 체크해주면 틀린 값을 얻게된다. if(arr[y][i]==0) continue; if(sum+arr[y][i]>min) continue; visited[i] = true; solve(y,i,cnt+1,sum+arr[y][i]); visited[i] = false; } } } | cs |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14888번 연산자 끼워넣기 (4) | 2018.08.22 |
---|---|
[백준] 6603번 로또 (0) | 2018.08.21 |
[백준] 2193번 이친수 (0) | 2018.08.20 |
[백준] 1339번 단어 수학 (0) | 2018.08.19 |
[백준] 2529번 부등호 (0) | 2018.08.19 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday