광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • OS
  • 다이나믹 프로그래밍
  • 티스토리챌린지
  • 파이썬
  • 드린이
  • DP
  • 애플워치 앱 만들기
  • 백준
  • 자바
  • 오블완
  • 구현
  • 합주
  • 애플워치 앱
  • BFS
  • BOJ
  • 운영체제
  • 컴퓨터 사이언스
  • 프로그래머스
  • 알고리즘
  • 개념

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

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

2021. 9. 24. 01:14
반응형

http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=954&sca=3030 

 

JUNGOL

 

www.jungol.co.kr

 

풀이

백트래킹, 순열 문제입니다.

회사에서 출발해서 배달 장소들의 순열을 돌고 다시 회사로 도착하므로

 

0 -> 배달지의 순열 -> 0    ( 문제 설명에서는 1을 회사라 소개하지만 코드상 0이 회사입니다) 

이런식으로 구현해서 풀었지만 시간초과가 났습니다.

 

이후 백트래킹 기법을 추가했습니다.

permutation 함수에서 파라미터를 val을 받아서 현재의 배달 비용을 저장하고, 

min_val(조건에 부합하는 최솟값)과 비교를 해줘서 val 크다면 다음 순열로 백트래킹.


import java.io.*;
import java.util.*;


public class Main {
	
	static int[][] map;
	
	static int n , min_val=100000;
	//순열 이용 
	static int[] numbers;
	static boolean[] isSelected;
	
	public static void main(String[] args) throws Exception{
		// TODO Auto-generated method stub
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		
		n=Integer.parseInt(br.readLine());
		//n이 1이 아닐때
		
		if(n!=1) {
			StringTokenizer st;
			map=new int[n][n];
			// 출발지와 목적지가 회사니까 numbers에 다음 목적지를 저장 
			numbers=new int[n-1];
			isSelected = new boolean[n-1];

			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());
				}
			}
			
			permutation(0, 0);
			//
			if(min_val==Integer.MAX_VALUE) System.out.println(0);
			else {			
				System.out.println(min_val);
			}			
		}
		// n=1일때 
		else {
			System.out.println(2*Integer.parseInt(br.readLine()));
		}

	}
	// val 백트래킹에 이용 
	// min_val를 기준으로 순열이 돌때마다 val에 이동하기 위한 비용을 더해주며,
	// 최소값보다 커지면 return
	
	// 출발지와 도착지가 회사므로 0->배달 장소의 순열 -> 0 
	private static void permutation(int cnt, int val) {
		// TODO Auto-generated method stub
		if(val>=min_val) return;

		if(cnt==n-1){
            int tmp;
            tmp=map[numbers[n-2]][0];
            if(tmp==0) return;
            min_val=Math.min(val+tmp, min_val);
            return;
            }

		for(int i=0; i<n-1; i++) {
			if(isSelected[i]) continue;
            int plus;
            numbers[cnt]=i+1;
            isSelected[i]=true;
 
            // cnt==0일때 0-> 첫번째 배달장소 
            if(cnt==0) plus=map[0][numbers[0]];
            // cnt!=0일 cnt-1 번째 배달장소 -> cnt번째 배달장소
            else plus=map[numbers[cnt-1]][numbers[cnt]];
            // 배달하지 못하는 상황일땐 백트래킹 
            if(plus==0) plus=100001;
            permutation(cnt+1, val+plus);
            isSelected[i]=false;
		}

	}

}

들여쓰기가 이상하게 나오네요... 코드는 돌려봤는데 이상은 없습니다 !!

반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 swea 8458] 원점으로 집합  (0) 2021.09.29
[Java/자바 백준 4485] 녹색 옷 입은 애가 젤다지?  (0) 2021.09.29
[JAVA/자바 백준 17472] 다리 만들기2  (0) 2021.09.17
[JAVA/자바 백준 14502] 연구소  (0) 2021.09.17
[JAVA/자바 SWEA 3124] 최소 스패닝 트리  (0) 2021.09.15
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 swea 8458] 원점으로 집합
    • [Java/자바 백준 4485] 녹색 옷 입은 애가 젤다지?
    • [JAVA/자바 백준 17472] 다리 만들기2
    • [JAVA/자바 백준 14502] 연구소
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바