๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 10971๋ฒˆ ์™ธํŒ์› ์ˆœํšŒ 2 ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 20.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 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;
    }

}

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€