본문 바로가기

알고리즘/백준

[JAVA]백준_10819_차이를최대로

문제 : www.acmicpc.net/problem/10819

 

10819번: 차이를 최대로

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

www.acmicpc.net

 

문제유형 : 브루트포스, 순열(next permutation)

 

풀이방식

1. 모든 경우의 배열의 순서를 만든다 (nextpermuation)

2. 넥퍼한 배열을 계산해서 최댓값 갱신

 

소스코드

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ_10819_차이를최대로_Main {

	private static int N;
	private static int[] arr;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		N = Integer.parseInt(input);
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		arr = new int[N];
		int result = Integer.MIN_VALUE;
		for (int i = 0; i < N; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(arr); // next permutation을 쓰기위하여 정렬
		
		do {
			// 연산하여 최댓값 구하기
			int sum = 0;
			for (int i = 0; i < N-1; i++) {
				sum+=Math.abs(arr[i]-arr[i+1]);
			}
			if(sum>result) result=sum;
		}while(np());
		
		System.out.println(result);
	}

	private static boolean np() {
		// Next Permutation
		int i = N-1;
		while(i>0&&arr[i-1]>=arr[i]) i--;
		
		if(i==0) return false;
		
		int j = N-1;
		while(arr[i-1]>=arr[j]) j--;
		
		swap(i-1, j);
		j=N-1;
		
		while(i<j) swap(i++, j--);
		return true;
	}

	private static void swap(int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA]백준_1260_DFS와BFS  (0) 2021.01.24
[JAVA]백준_13335_트럭  (0) 2021.01.20
[JAVA]백준_10974_모든 순열  (0) 2021.01.19
[JAVA]백준_10597_순열장난  (0) 2021.01.18
[JAVA]백준_6087_레이저통신  (0) 2020.09.23