컴퓨터 공학 기초/알고리즘 (브루트포스)

백준 10819 (차이를 최대로)

JongSeok_12 2020. 8. 19. 16:40

https://www.acmicpc.net/problem/10819

 

10819번: 차이를 최대로

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

www.acmicpc.net

해당 문제는 N개의 정수가 주어질 때 해당 정수를 아래에 식에 맞춰 계산 했을 때 나올 수 있는 최대한의 수를 구하는 문제이다. 이때 주어진 정수의 위치는 사용자가 바꿀 수 있으므로 순열을 이용하여 주어진 정수들의 숫자를 바꾸어 모든 탐색을 진행한다. 이렇게 탐색을 진행하면서 바꾼 수열에 식을 대입하여 결과 값만 비교하면 풀리는 문제이다.

 

풀이 :

#include <iostream>
#include <vector>


using namespace std;

int n, maxx = -9999999;
vector<int> nList;
vector<int> results;
int used[10001];

// 순열 합계구하기
int getSum(vector<int> nList){
	int sum = 0;
	for (int i = 0; i < n - 1; ++i){
		sum += abs(nList[i] - nList[i + 1]);
	}
	return sum;
}

void dfs(int level){

	if (level == n){
		int sum = getSum(results);
		if (maxx < sum) maxx = sum;
		return;
	}

	for (int i = 0; i < n; ++i){
		if (used[i] == 1) continue;
		used[i] = 1;
		results.push_back(nList[i]);
		dfs(level + 1);
		used[i] = 0;
		results.pop_back();
	}

}


int main(){
	//freopen_s(new FILE*, "tes.text", "r", stdin);
	cin >> n;
	for (int i = 0; i < n; ++i){
		int tmp;
		cin >> tmp;
		nList.push_back(tmp);
	}
	dfs(0);
	cout << maxx << endl;
}