본문 바로가기

백준

백준10819 - 차이를 최대로

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

 

10819번: 차이를 최대로

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

www.acmicpc.net

순열을 이용하여 푼 문제이다. 숫자는 최대 8개가 들어가기 때문에 시간초과 걱정은 하지 않았다. 숫자를 뽑은 순서에 따라서 결과가 달라지기 때문에 순열을 이용해야 한다. n개 만큼 숫자를 뽑았다면 인접한 수들의 차이를 구하여 절댓값을 취한 뒤 모두 더한다. 그러한 결과들 중에서 가장 큰 결과를 고르면 된다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n; //입력 받을 숫자들의 갯수
int num; //각각의 숫자로 입력받을 원소
int big = -1; //가장 큰 결과
vector<int> v; //처음 숫자들을 저장할 공간
vector<int> res; //숫자를 뽑은 결과
vector<bool> visit; //숫자를 방문한 여부

//permutation 구현
void dfs(int y) { //y는 현재까지 뽑은 수의 갯수
	if (y == n) {
		int cnt = 0;
		//인접한 두 수의 차이를 구함
		for (int i = 0; i < res.size() - 1; i++) { 
			cnt = abs(res[i] - res[i + 1]) + cnt; 
		}
		big = max(big, cnt); //큰 쪽 선택
		return;
	}
	else {
		for (int i = 0; i < n; i++) { //순서가 다르면 다른 순열이므로 0부터 n까지 탐색
			if (!visit[i]) { //선택하지 않은 원소이면
				res.push_back(v[i]); //원소를 삽입하고
				visit[i] = true; //방문처리한 다음
				dfs(y + 1); //선택한 갯수를 늘려서 다음 탐색으로 수행
				res.pop_back(); //선택한 원소를 삭제하고
				visit[i] = false; //선택한 원소를 미방문 처리
			}
		}
	}
}

int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> num;
		v.push_back(num);
		visit.push_back(false);
	}

	dfs(0); //탐색 시작, 처음 뽑은 원소는 0개

	cout << big;
}

'백준' 카테고리의 다른 글

백준17141 - 연구소 2  (0) 2020.03.12
백준2234 - 성곽  (0) 2020.03.11
백준1967 - 트리의 지름  (0) 2020.03.10
백준7569 - 토마토  (0) 2020.03.05
백준6593 - 상범 빌딩  (0) 2020.03.04