๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 10971๋ฒ ์ธํ์ ์ํ 2 ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
10971๋ฒ: ์ธํ์ ์ํ 2
์ฒซ์งธ ์ค์ ๋์์ ์ N์ด ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 10) ๋ค์ N๊ฐ์ ์ค์๋ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ๋ ฌ์ ์ฑ๋ถ์ 1,000,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ 0์ด ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ j
www.acmicpc.net
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
๋ฌธ์ ์ ๊ทผ
์ด๋ฒ ๋ฌธ์ ๋ CS ๋ถ์ผ์์ ์ ๋ช ํ ๋ฌธ์ ๋ผ๊ณ ํ๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
n by n ํ๋ ฌ์์ (n, m)์ ํน์ arr[n][m]
์ n์์ m์ผ๋ก ๊ฐ๋ ๋น์ฉ ์ด๋ค.
์ฐ๋ฆฌ๋ ์ด ๋น์ฉ์ ์ต์ํํด์ผ ํ๋ค.
์๋์ ๊ฐ์ด 4 x 4 ํ๋ ฌ์ด ์๋ค๋ฉด
0 1 2 1
3 0 3 2
1 2 0 1
2 1 2 0
0 -> 1 1 -> 2 2 -> 3 3 -> 0 // ์ด๋ ๊ฒ ๊ฐ๋
1 -> 3 3 -> 2 2 -> 0 0 -> 1 // ํน์ ์ด๋ ๊ฒ ๊ฐ๋ ์๊ด ์์
์ด๋ป๊ฒ ๊ฐ๋ ๋ชจ๋ ๋์๋ง ๋ค ๋ฐฉ๋ฌธํ๋ฉด ๋๋ค.
๊ทธ๋ผ ๋ชจ๋ ๋์๋ฅผ ๋ค ๋ฐฉ๋ฌธํ๋ ค๋ฉด ์์ด์ ์ด์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ์์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๊ฐ N * N!
๊ฐ ๋๋ค.
N * N!
๋ ์ ํ ์์ง ์์ ์๊ฐ ๋ณต์ก๋์ด๋ ์ต์
์ ๊ฒฝ์ฐ๊น์ง ๊ณ์ฐํด๋ด์ผ ํ๋๋ฐ, 10 * 10! = 36,288,000
์ผ๋ก 2์ด ๋ด์ ํด๊ฒฐํ ์ ์๋ ์ถฉ๋ถํ ์์ด ๋๋ค.
๊ทธ๋ผ ์ฐ๋ฆฌ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ๋ ์์๋ฅผ ์์ด๋ก์จ ๋ํ๋ด๊ณ ๊ทธ ๊ฐ์ค์น๋ค๋ง ๊ณ์ฐํด์ฃผ๋ฉด ์ํ์ ํ์ํ ์ต์ ๋น์ฉ์ ์ฐพ์ ์์์ ๊ฒ ๊ฐ๋ค.
ํด๊ฒฐ๋ฒ
๋ชจ๋ ์์ด์ ๊ตฌํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ Next Permutation์ ์ด์ฉํ ๊ฒ์ด๋ค.
private static boolean nextPermutation(int[] arr) {
int i = arr.length-1;
while(i > 0 && arr[i-1] >= arr[i]) i--;
if(i <= 0) return false;
int j = arr.length-1;
while(arr[j] <= arr[i-1]) j--;
swap(arr, i-1, j);
j = arr.length - 1;
while(i < j) {
swap(arr, i, j);
i++;
j--;
}
return true;
}
private static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
์ค๋ต ํ๋ณด
์ด ๋ฌธ์ ์์ ๊ฐ์ฅ ์ฃผ์ํด์ผ ํ๋ ๊ฒ์ ๋ฐ๋ก ์ด๊ฒ์ด๋ค.
i ๋์์์ j ๋์๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋์๋ฅผ ๋์์ผ ํ๋ค.
๊ทธ๋ผ i ๋์์์ j ๋์๋ก ๋ชป ๊ฐ๋ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค๋ฉด 0 -> 1, 1 -> 2
๋ง์ ๋๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฉด ์ด ๊ฒ์ ์ ๋ต์ด ๋ ์ ์๋ค.
์? ๋ชจ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๊ธฐ ๋๋ฌธ.
ํ์ง๋ง ์ด ๊ฒฝ์ฐ์ ํํฐ๋ง์ ํด์ฃผ์ง ์๋๋ค๋ฉด ๋ชจ๋ ๋์๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์๋ ์ต์ ๊ฐ์ด ์ถ๋ ฅ๋ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด์ ์ ์ํ์
์ ๋ต ์ฝ๋
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[][] map;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
map = new int[n][n];
int[] country = new int[n];
for (int i = 0; i < n; i++) {
country[i] = i;
for (int j = 0; j < n; j++) {
map[i][j] = input.nextInt();
}
}
int answer = Integer.MAX_VALUE;
do {
int sum = 0;
boolean flag = false;
for (int i = 0; i < country.length - 1; i++) {
if(map[country[i]][country[i+1]] == 0) flag = true;
else sum += map[country[i]][country[i+1]];
}
int value = map[country[country.length - 1]][country[0]];
if(!flag && value != 0) {
sum += value;
answer = Math.min(answer, sum);
}
}while(nextPermutation(country));
System.out.println(answer);
}
private static boolean nextPermutation(int[] arr) {
int i = arr.length - 1;
while(i > 0 && arr[i-1] >= arr[i]) i--;
if(i <= 0) return false;
int j = arr.length - 1;
while(arr[i-1] >= arr[j]) j--;
swap(arr, i-1, j);
j = arr.length - 1;
while(i < j) {
swap(arr, i, j);
i++;
j--;
}
return true;
}
private static void swap(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
๋๊ธ