백준/실버
[백준 10819번] 차이를 최대로 (C++)
게임개발기원
2025. 3. 5. 21:29
문제링크 : https://www.acmicpc.net/problem/10819
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, max_n;
int arr[8], perm[8];
bool visited[8];
void dfs(int idx)
{
if(idx==n) //최대값 계산
{
int sum = 0;
for(int i=0; i<n-1; i++)
{
int gap = abs(perm[i]-perm[i+1]);
sum+=gap;
}
max_n = max(max_n, sum);
return;
}
for(int i=0; i<n; i++)
{
if(visited[i]) continue;
visited[i] = 1; //현재 숫자 선택
perm[idx] = arr[i]; //순열에 값 저장
dfs(idx+1);
visited[i] = false; //백트래킹 (선택 취소)
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for(int i=0; i<n; i++) cin >> arr[i];
dfs(0);
cout << max_n;
return 0;
}
백트래킹을 이용해 푸는 문제이다.
먼저 처음 위치인 0부터 시작하여 최대 idx가 n에 도달할 때 해당 조합에 대한 차이 값을 계산하며 최대값도 비교해준다.
조합하는 과정은 방문 배열을 통해 현재 숫자가 선택되었는지, 취소되었는지를 체크해주고,
순열 배열에 현재 배열 값을 담아준다.
이후에 인덱스를 증가시켜 다음 값을 체크하게 되며 이 인덱스가 n에 도달 하면 위에서 설명했단 계산을 거치게 된다.
선택했던 값을 재귀를 돌고 이후에 취소 시켜주어야만 다른 조합에서 쓸 수 있음에 주의해야한다.