문제
N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.
|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|
입력
- 첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.
출력
- 첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.
입력 예제
6
20 1 15 8 4 10
출력 예제
62
문제 풀이
- n크기의 순열을 저장할 리스트를 만들어 연산을 시행할 인덱스 정보를 저장
- idx == n 조건에서 새로운 순열이 만들어지면 주어진 연산을 수행한다.
abs(array[calc[i]] - array[calc[i + 1]])
- 연산의 최댓값이 아닌 식의 최대 차이를 구해야하므로 잊지않고 절댓값으로 연산을 수행해야한다.
Python 코드
n = int(input())
array = list(map(int,input().split()))
calc = []
visited = [0] * n
max_value = float('-inf')
def recursive(idx):
global max_value
# basis part
if idx == n:
value = 0
# 연산 실행
for i in range(n - 1):
value += abs(array[calc[i]] - array[calc[i + 1]])
max_value = max(max_value, value)
return
# inductive part
for i in range(n):
if not visited[i]:
visited[i] = 1
calc.append(i)
recursive(idx + 1)
visited[i] = 0
calc.pop()
recursive(0)
print(max_value)
C++ 코드
#include <iostream>
#include <stdlib.h>
#include <limits.h>
#include <vector>
using namespace std;
vector<int> visited;
vector<int> calc;
vector<int> array;
int n;
int result = INT_MIN;
void recursive(int idx) {
// basis part
if (idx == n) {
int res = 0;
for (int i = 0; i < n - 1; i++) {
res += abs(array[calc[i]] - array[calc[i + 1]]);
}
result = max(result, res);
}
// inductive part
for (int i = 0; i < n; i++) {
if (!visited[i]) {
visited[i] = 1;
calc.push_back(i);
recursive(idx + 1);
visited[i] = 0;
calc.pop_back();
}
}
}
int main() {
cin >> n;
visited.resize(n, 0);
array.resize(n);
for (int i = 0; i < n; i++) {
cin >> array[i];
}
recursive(0);
cout << result;
}
'Algorithm > BackTracking' 카테고리의 다른 글
| [Python] 백준 12919 A와B 2 (8) | 2024.09.22 |
|---|---|
| [Python] SWEA 2806번 N-Queen (0) | 2023.05.13 |