본문 바로가기
Algorithm/BOJ

[BOJ]10819번: 차이를 최대로(c++)

by HBGB 2020. 5. 11.

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

 

10819번: 차이를 최대로

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

www.acmicpc.net

 

방법 1: 라이브러리 사용

#include <iostream>
#include <cmath>
#include <algorithm>

using namespace std;

int get_dif_sum(int numbers[], int N)
{
	int t_dif = 0;
	for (int i = 1; i < N; ++i)
	{
		t_dif += abs(numbers[i] - numbers[i - 1]);
	}
	return t_dif;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	const int MAX = 8;
	int nums[MAX];

	// 입력
	int N;
	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		cin >> nums[i];
	}

	// 오름차순 정렬
	sort(nums, nums + N);

	// 숫자간의 최대 차이값 합계 구하기
	int max_dif = 0;
	do {
	
		int t_dif = get_dif_sum(nums, N);
		if (max_dif < t_dif)
		{
			max_dif = t_dif;
		}
	
	} while (next_permutation(nums, nums + N));

	// 출력
	cout << max_dif;

	return 0;
}

 

방법 2: dfs

#include <iostream>
#include <cmath>

using namespace std;

const int MAX = 8;
int nums[MAX];
int output[MAX];
int visited[MAX];
int max_dif;

void dfs(int N, int M, int depth)
{
	if (M == depth)
	{
		// 가장 차이가 큰 순열 찾기
		int t_dif = 0;
		for (int i = 1; i < M; ++i)
		{
			t_dif += abs(output[i] - output[i - 1]);
		}

		if (max_dif < t_dif)
		{
			max_dif = t_dif;
		}

		return;
	}

	// 아직 방문하지 않은 숫자 선택 -> 다음 자리를 위해 dfs(depth + 1) 호출
	for (int i = 0; i < N; ++i)
	{
		if (!visited[i])
		{
			visited[i] = true;
			output[depth] = nums[i];
			dfs(N, M, depth + 1);
			visited[i] = false;
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int N;
	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		cin >> nums[i];
	}

	// N개 숫자 중에서 N개 뽑아서 조합
	dfs(N, N, 0);

	// 최대 차이값 출력
	cout << max_dif;

	return 0;
}

 

 

속도는 똑같다. c++은 그냥 라이브러리 사용하는게 편하다

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1260번: DFS와 BFS(c++)  (0) 2020.05.12
[BOJ]10971번: 외판원 순회 2(c++)  (0) 2020.05.11
[BOJ]10974번: 모든 순열(c++)  (0) 2020.05.11
[BOJ]10973번: 이전 순열(c++)  (0) 2020.05.11
[BOJ]10972번: 다음 순열(c++)  (0) 2020.05.10

댓글