smooth waters run deep

1d-1c/BOJ

10819_차이를 최대로 (JAVA)

yeon_11 2020. 11. 15. 23:33
 

10819번: 차이를 최대로

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
	static int N;
	static int ans = 0;
    
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());

		List<Integer> temp = new ArrayList<>();
		boolean[] checked = new boolean[N];
		int[] num = new int[N];

		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++){
			num[i] = Integer.parseInt(st.nextToken());
		}

		func(num, temp, checked);

		System.out.println(ans);
	}

	private static void func(int[] num, List<Integer> temp, boolean[] checked){
		if(temp.size() == N){
			int cal = 0;
			for(int i=1; i<N; i++){
				cal += Math.abs(temp.get(i-1)-temp.get(i));
			}
			ans = Math.max(cal, ans);
		}

		for(int i=0; i<N; i++){
			if(!checked[i]){
				checked[i] = true;
				temp.add(num[i]);
				func(num, temp, checked);

				checked[i] = false;
				temp.remove(temp.size()-1);
			}
		}
	}
}

 

입력받는 N의 최대값은 8이다. 최악의 경우 8! 이므로, 모든 경우를 탐색해서 최대값을 출력하면 된다.

 

입력받은 N개의 숫자의 순서를 바꾸어야 한다. 

== N개의 숫자 중에서 N개를 뽑아 중복없이 순서있는 수열을 만드는 것과 같다.

== 순열 (nPn) 구하기

 

다만 체크해줘야될 것은, 우리는 최대값을 출력해야 하므로

nPn의 모든 경우를 탐색하고 그 과정에서 최대값을 변경해준다.

 

 

 

** 내가 생각한 방법!

더보기

나는 입력 범위를 체크하지 않아서, 모든 경우를 탐색하는 경우를 생각 못했다.

내가 생각한 방법은

오름차순 정렬 -> 왼쪽부터(최소값부터), 오른쪽부터(최대값부터) 를 왔다갔다하는.. 방법을 생각했다. (한 번에 정리가 안된다!)

 

예를 들어 설명하면,  (num[] = {20, 1, 15, 8, 4, 10}일 때)

 

1. 오름차순 정렬 : 1, 4, 8, 10, 15, 20

2. 최소값=1, 최대값=20 을 num[N/2-1], num[N/2-2] 자리에 넣는다. : - - 1 20 - - 가 된다.

3. - - 1 20 - - 에서,

   1을 기준으로 왼쪽으로, 20을 기준으로 오른쪽으로 이동하면서 숫자를 동시에 넣어준다.

   오름차순 정렬한 순서대로 숫자를 넣어주는데,

   1은 최소값이니까 20 다음 최대값인 15를 넣어주고,

   20은 최대값이므로 1 다음 최소값인 4를 넣어준다.

 

4. 순서대로 나열해보면 다음과 같다.

   - - 1 20 - -

   - 15 1 20 4 -

   8 15 1 20 4 10 : 이 경우가 출력값이 최대가 되는 경우가 된다!

 

 

근데 생각만 하고 구현을 못했다ㅎㅎㅎ 다음에 다시 풀어봐야지!

 

'1d-1c > BOJ' 카테고리의 다른 글

2529_부등호 (JAVA)  (0) 2020.11.17
10026_적록색약 (JAVA)  (0) 2020.11.16
15663~15666_ N과 M (9)~(12) (JAVA)  (0) 2020.11.13
15654~15657_N과 M (5)~(8) (JAVA)  (0) 2020.11.11
15649~15652_N과 M (1)~(4) (JAVA)  (0) 2020.11.11