백준 10971번 - 외판원 순회2

package baekjoon;

import java.util.Scanner;

public class Exam10971 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		int[][] w = new int[N][N];

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				w[i][j] = sc.nextInt();
			}
		}

		int[] num = new int[N];
		for (int i = 0; i < N; i++) {
			num[i] = i;
		}

		int answer = Integer.MAX_VALUE;

		do {
            // 0이 존재하는지 확인하는 변수, 올바른 경로 인지 판별
			boolean ok = true; 
			int sum = 0; // 경로의 비용을 담는 변수
			for (int i = 0; i < N - 1; i++) {
				if (w[num[i]][num[i + 1]] == 0) {
					ok = false;
				} else {
					sum += w[num[i]][num[i + 1]];
				}
			}
            // 마지막 도시에서 원래도시로 돌아왔을 때 0인지 판별
			if (ok && w[num[N - 1]][num[0]] != 0) { 
				sum += w[num[N - 1]][num[0]];
				if (answer > sum) {
                    // 값을 계산해 최소값을 넣으면 된다.
					answer = sum; 
				}
			}
		} while (next(num));
		System.out.println(answer);
	}

	public static boolean next(int[] num) {
		int i = num.length - 1;

		while (i > 0 && num[i - 1] >= num[i]) {
			i -= 1;
		}

		if (i <= 0) {
			return false;
		}
		int j = num.length - 1;
		while (num[j] <= num[i - 1])
			j -= 1;
		int temp = num[i - 1];
		num[i - 1] = num[j];
		num[j] = temp;

		j = num.length - 1;
		while (i < j) {
			int tem = num[i];
			num[i] = num[j];
			num[j] = tem;

			i += 1;
			j -= 1;
		}
		return true;
	}
}