문제
문제
N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.
|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|
입력
첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.
출력
첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.
풀이
#브루트포스 #백트래킹
우선, N의 범위가 최대 8이기 때문에 브루트포스를 사용할 수 있다.
백트래킹을 사용하며 임시 배열(caseArr)에 cnt를 인덱스로 하여 원소값을 임시로 저장해준다.
임시 배열에 입력 받은 원소값들이 모두 들어오면 임시배열값에 대해 계산을 수행하고 함수를 종료시킨다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int answer=Integer.MIN_VALUE;
static int[] arr;
static int[] caseArr;
static int N;
static boolean[] visited;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
N=Integer.parseInt(br.readLine());
arr=new int[N];
visited=new boolean[N];
caseArr=new int[N];
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=0;i<N;i++){
arr[i]=Integer.parseInt(st.nextToken());
}
solution(0);
System.out.println(answer);
}
static void solution(int cnt){
if(cnt==N){
int sum=0;
for(int i=0;i<N-1;i++){
sum+=Math.abs(caseArr[i]-caseArr[i+1]);
}
answer=Math.max(answer, sum);
return;
}
for(int i=0;i<N;i++){
if(!visited[i]){
visited[i]=true;
caseArr[cnt]=arr[i];
solution(cnt+1);
visited[i]=false;
}
}
}
}
'알고리즘연습 > 백준' 카테고리의 다른 글
[BOJ] 2636번 치즈 자바 (0) | 2022.07.02 |
---|---|
[BOJ] 1182번 부분수열의 합 자바 (0) | 2022.06.26 |
[BOJ] 2468번 안전영역 자바 - bfs (0) | 2022.06.21 |
[BOJ] 11403번 경로찾기 java (0) | 2022.06.20 |
[BOJ] 1026번 보물 자바 - 정렬 (0) | 2022.06.20 |