본문 바로가기

백준 온라인 저지 (BOJ) 문제풀이

백준 온라인 저지 (BOJ) 10819 차이를 최대로

문제

N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

입력

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

출력

첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.

 

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
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#pragma warning(disable:4996)
#pragma warning(disable:6031)
int arr[9], nums[9];
bool check[9];
int n,temp, size = 0, ans = -0x7fffffff;
void go() {
    if (size == n) {
        temp = 0;
        for (int i = 1; i <= n - 1; i++)
            temp += abs(arr[i] - arr[i + 1]);
        if (temp > ans)ans = temp;
        return;
    }
    for (int i = 1; i <= n; i++) {
        if (!check[i]) {
            arr[++size= nums[i];
            check[i] = true;
            go();
            check[i] = false;
            size--;
        }
    }
}
int main() {
    scanf("%d"&n);
    for (int i = 1; i <= n; i++)
        scanf("%d"&nums[i]);
    go();
    printf("%d\n", ans);
    return 0;
}
cs

n의 최댓값이 8이여서 그냥 재귀로 모든 경우를 탐색해서 풀었다.