Algorithm/BackTracking

[Python/C++] 백준 10819번 차이를 최대로

코딩쪼앙 2025. 1. 13. 22:08

문제


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