Problem Solving/Baekjoon

[백준] 10819 차이를 최대로 - Backtracking / Java

graycode 2022. 7. 8. 22:42

 문제 링크

 

10819번: 차이를 최대로

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

www.acmicpc.net

 

 풀이 과정

방문 여부를 확인하는 재귀 호출 함수로 입력받은 배열의 중복을 허용하지 않은 모든 순열을 구한다.

 

순열에 문제에 제시된 (arr[0] - arr[1]) + (arr[1] - arr[2]) + ... + (arr[n - 2] - arr[n - 1]) 의 연산을 수행하는데

이는 배열의 현재 인덱스와 다음 인덱스를 뺀 값을 sum 변수에 연속해서 더하며

식의 최댓값을 구하는 순서를 찾기 위해, 뺄셈의 값은 절대값으로 계산한다.

 

각각의 순열에서 구해진 연산의 값을 최댓값에 매번 갱신하여 정답으로써 출력한다.

 

 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	
	static int n;
	static int[] arr;
	static boolean[] visit;
	static int[] result;
	static int max;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		n = Integer.parseInt(br.readLine());
		arr = new int[n];
		visit = new boolean[n];
		result = new int[n];

		String[] input = br.readLine().split(" ");
		for (int i = 0; i < n; i++)
			arr[i] = Integer.parseInt(input[i]);

		recur(0);

		bw.write(max + "\n");
		bw.flush();
	}
	
	private static void recur(int depth) {
		if (depth == n) {
			setMax(result);
			return;
		}

		for (int i = 0; i < n; i++) {
			if (!visit[i]) {
				result[depth] = arr[i];

				visit[i] = true;
				recur(depth + 1);
				visit[i] = false;
			}
		}
	}

	private static void setMax(int[] result) {
		int tmp = 0;

		for (int i = 0; i < n - 1; i++)
			tmp += Math.abs(result[i] - result[i + 1]);

		max = Math.max(max, tmp);
	}

}