문제 : https://www.acmicpc.net/problem/10819
핵심
순열을 사용해서 전체 경우의 수를 구한다.
문제에서 N의 범위는 3<=N<=8 이므로 최대 경우의 수는 8! = 40320이다.
풀이
입력받은 정수의 개수 N에 대하여 배열에 들어갈 수를 입력받는다.
순열을 구하기 전에 오름차순으로 정렬을 한다.
next_permutation 을 통해서 N!개의 모든 순열을 구한다. 그리고 _Cal()_이라는 함수를 통해서 해당 순열의 차이의 최대값의 합
을 저장한다.
그리고 처음에 값을 value 에 저장했다가 Calculate_sum을 통해서 계산되는 차이의 합과 value를 _Math.max_을 이용해서 최대값을 구한다.
value에 저장한다. 결국, value -> 차이의 최대값
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 public class Exam10819 { public static void main (String[] args) throws NumberFormatException, IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(bf.readLine()); int [] number_arr = new int [N]; StringTokenizer st = new StringTokenizer(bf.readLine(), " " ); for (int i=0 ;i<N;i++) { number_arr[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(number_arr); int value = 0 ; do { int cal_sum = Calculate_sum(number_arr); value = Math.max(value, cal_sum); }while (next_permutation(number_arr)); System.out.println(value); } public static int Calculate_sum (int [] arr) { int sum = 0 ; for (int i=1 ;i<arr.length;i++) { sum = sum + Math.abs(arr[i]-arr[i-1 ]); } return sum; } public static boolean next_permutation (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--; } int tmp = arr[i-1 ]; arr[i-1 ] = arr[j]; arr[j] = tmp; j = arr.length-1 ; while (i<j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } return true ; } }