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

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 10819๋ฒˆ ์ฐจ์ด๋ฅผ ์ตœ๋Œ€๋กœ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 20.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 10819๋ฒˆ ์ฐจ์ด๋ฅผ ์ตœ๋Œ€๋กœ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋กœ๊ทธ์ธ

 

www.acmicpc.net

 

10819๋ฒˆ: ์ฐจ์ด๋ฅผ ์ตœ๋Œ€๋กœ

์ฒซ์งธ ์ค„์— N (3 ≤ N ≤ 8)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋ฐฐ์—ด A์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ •์ˆ˜๋Š” -100๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

www.acmicpc.net

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฌธ์ œ ์ ‘๊ทผ

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ํ’€์ด ์กฐ๊ฑด์€ ๊ทธ๋‹ฅ ์–ด๋ ต์ง€ ์•Š๋‹ค.

 

๋‹จ์ง€ ๊ฐ๊ฐ ์›์†Œ์˜ ๋‹ค์Œ ์›์†Œ์™€ ์ฐจ์ด๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ์‹์— ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

 

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋ ๊นŒ?

 

์•„์ง ๋‚˜์˜ ๋Šฅ๋ ฅ์œผ๋กœ๋Š” ์‰ฝ๊ฒŒ ์ ํ™”์‹์ด ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ธŒ๋ฃจํŠธ ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐฐ์šด ๋‚˜๋Š” ์ฐจ์ด๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ •์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ์ ์ ˆ์ด ๋ฐ”๊ฟ”์„œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด ์–ด์จŒ๋“  ์ฐจ์ด๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๊ตฌํ•ด์งˆ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ •์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๊ทธ๋ ‡๋‹ค. ๋ฐ”๋กœ ์ˆœ์—ด์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


์šฐ๋ฆฌ๋Š” ์ „ ์‹œ๊ฐ„๋ถ€ํ„ฐ ํ•ด์„œ ๊ณ„์† Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ด์™”๋‹ค.

 

์ด ๋ฌธ์ œ์—์„œ ์‹ค์ œ๋กœ Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๋จผ์ € ํ™•์ธ ๋ถ€ํ„ฐ ํ•ด๋ณด์ž

 

Next Permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ˆ˜์—ด์˜ ์›์†Œ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ๊ฐ์˜ ์ˆ˜์—ด์˜ N-1 ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋น„๊ต, ์Šค์™‘ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— N * N! ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

 

์ด ๋ฌธ์ œ์—์„œ N์€ ์ตœ๋Œ€ 8๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ 8 * 8! = 322,560 ๋ฒˆ ์ด๋ผ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

์ถฉ๋ถ„ํžˆ ์‹œ๊ฐ„ ์•ˆ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ๋Ÿผ next permutation์„ ๊ตฌํ˜„ํ•˜์ž.

์˜ค๋‹ต ํ›„๋ณด

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

 

์ˆœ์—ด์˜ Next Permutation์€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ๋˜๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜๋‚˜?

 

Next Permutation์— ์žˆ์–ด์„œ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์ˆ˜์—ด์˜ ์ •๋ ฌ ์—ฌ๋ถ€๋Š” ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‚ด๊ฐ€ A = {1 2 3 4} ๋ผ๋Š” ์ˆ˜์—ด๊ณผ B = {1 4 2 3} ์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.


์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ์›์†Œ๋Š” ๊ฐ™๊ณ  ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋ƒ ์•ˆ๋˜์–ด์žˆ๋ƒ์˜ ์ฐจ์ด์ด๋‹ค.

 

์ด ๋‘ ์ˆ˜์—ด์„ next permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ์ˆœ์—ด์„ ๊ตฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

next permutation ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ์ปจ์…‰ ์ž์ฒด๊ฐ€ i์™€ j ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋Œ€์†Œ ๋น„๊ต๋ฅผ ํ•˜๋ฉฐ swap ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ์ด ์ˆœ์—ด์˜ ๊ฒฐ๊ณผ์— ๋งค์šฐ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ˆ˜์—ด์˜ ์ˆœ์—ด์€ ์ •๋ ฌ๋œ ์ˆ˜์—ด์˜ ์ˆœ์—ด๋ณด๋‹ค ๋” ์ ๊ฒŒ ๋‹ค์Œ ์ˆœ์—ด์—ฐ์‚ฐ์„ ํ•  ๊ฒƒ์ด๊ณ  ๊ฒฐ๊ตญ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ˆœ์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ์ด ์ ์„ ์ฃผ์˜ ํžˆ์ž.

์ •๋‹ต ์ฝ”๋“œ

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

        int n = input.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = input.nextInt();
        }

        int answer = 0;
        Arrays.sort(arr);
        do {
            answer = Math.max(answer, getFormulaResult(arr));
        } while(nextPermutation(arr));

        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;
    }

    private static int getFormulaResult(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            sum += Math.abs(arr[i] - arr[i + 1]);
        }
        return sum;
    }
}

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

๋Œ“๊ธ€