본문 바로가기
JungOl/Intermediate_Coder

[JUNGOL/JAVA] 정올 1681 : 해밀턴 순환회로 (자바)

by HoonSikE 2022. 2. 24.
반응형
SMALL

 

문제 정보
Intermediate_Coder
  문제명
   - 해밀턴 순환회로

문제 번호 - 1681번

문제 링크

Jungol_1681_해밀턴_순환회로 

 

JUNGOL

 

www.jungol.co.kr


문제
태현이는 방학기간 동안 택배 알바를 해서 최고급 노트북을 장만하려고 한다.
오늘 배달해야 하는 장소를 한 번씩만 방문해서 물건을 모두 배달하고 다시 회사로 돌아와야 한다.
배달하는 장소에만 도착할 수 있다면 물건은 모두 배달할 수 있으므로 물건의 개수나 크기등은 고려하지 않아도 된다.
 
그런데 문제는 방문하는 순서를 어떻게 정할지가 고민이다. 
어떤 장소에서 다른 장소로 이동하는 데에는 비용이 발생하는데 만약 방문하는 순서를 잘못 정하게 되면
알바비로 받은 돈을 모두 이동비용으로 사용하고 눈물을 흘릴지도 모른다.
 
태현이가 물건을 모두 배달하고 회사로 돌아오기 위한 최소의 비용을 계산하는 프로그램을 작성해 주자.

입력
첫 줄은 배달해야 하는 장소의 수 N(1≤N≤13)이 주어진다. 이때, 출발지(회사)는 1번이다.
둘째 줄은 N X N 크기의 장소와 장소를 이동하는 비용(0 ≤ 비용< 100)이 한 칸씩의 공백으로 구분하여 주어진다.
비용은 양방향이 아니라 단방향으로 가기 위한 비용이다. 
 
예들 들어 첫 번째 행 두 번째 열에 적힌 비용은 1번 장소에서 2번 장소로 이동하기 위한 비용을 의미하며, 
2번 장소에서 1번 장소로 이동하기 위한 비용은 두 번째 행 첫 번째 열에 주어진다. 
 
장소 사이에 이동할 수 있는 방법이 없다면 비용을 0으로 표시한다.

출력
회사에서 출발하여 오늘 배달해야 하는 모든 장소를 한 번씩 들러 물건을 배달하고 회사에 돌아오기 위한 최소의 비용을 출력한다.

예제 입력/출력
예제 입력 예제 출력
5
0 14 4 10 20
14 0 7 8 7
4 5 0 7 16
11 7 9 0 2
18 7 17 4 0
30

알고리즘 분류
● 백트래킹

소스코드
package Intermediate_Coder_04_백트래킹_DFS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
 * @author HanHoon
 * @category 백트래킹
 * http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=954&sca=3030
 */
public class Jungol_1681_해밀턴_순환회로 {
	static int N;
	static int result = Integer.MAX_VALUE;
	static int[][] map;
	static boolean[] visited;
	public static void dfs(int start, int index, int cost) {
		// 기저조건
		// 비용이 result보다 크다면 return
		if(cost>= result)	return;
		// 회사로 돌아간다.
		if(index == N-1) {
			// 회사로 돌아가는 길이 있다면
			if(map[start][0] != 0) {
				result = result > cost+map[start][0] ? cost+map[start][0] : result;
			}
			return;
		}
		// 회사(0)에서 다음으로 출발, i = 0부터 해도 되지만 굳이 할 필요가 없음.
		for (int i = 1; i < N; i++) {
			if(map[start][i] != 0 && !visited[i]) {
				visited[i] = true;
				dfs(i, index+1, cost + map[start][i]);
				visited[i] = false;
			}
		}
	}
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;

		// N : 배달해야 하는 장소의 수 (단, 1은 출발지(회사))
		N = Integer.parseInt(br.readLine());
		// NxN 크기의 map
		map = new int[N][N];
		visited = new boolean[N];
		// map의 값 입력
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		dfs(0,0,0);
		System.out.println(result);
		br.close();
	}
}

JungOl List
 

JungOl List

초기 세팅 시작 시 주의할 점  Language_Coder 출력 입력 연산자 디버깅 선택 제어문 반복 제어문 1, 2, 3 배열 1, 2 함수 1, 2, 3   기회는 준비된 자에게 찾아온다.

han-hoon.tistory.com


  

기회는 준비된 자에게 찾아온다.

 


 

반응형
LIST

'JungOl > Intermediate_Coder' 카테고리의 다른 글

[JUNGOL/JAVA] 정올 1828 : 냉장고 (자바)  (0) 2022.02.24

댓글