728x90
반응형
https://www.acmicpc.net/problem/10819
10819번: 차이를 최대로
첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.
www.acmicpc.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <iostream>
#include<istream>
#include<algorithm>
#include <string>
using namespace std;
static int ans = 0;
static int maxAns = 0;
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void permatuation(int *arr, int depth, int n, int r) {
if (depth == r) {
ans = 0;
int i = 0;
int j = 1;
while (j <=r-1&&i<=r-2) {
ans += abs(arr[j] - arr[i]);
i++;
j++;
}
if (ans > maxAns) {
maxAns = ans;
}
return ;
}
else {
for (int i = depth; i < n; i++) {
swap(arr[depth], arr[i]);
permatuation(arr, depth + 1, n, r);
swap(arr[depth], arr[i]);//다시 되돌려줌
}
}
}
int main(){
int n;
scanf("%d", &n);
int* arr = new int[n];
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
arr[i] = num;
}
sort(arr, arr + n);
permatuation(arr, 0, n, n);
printf("%d", maxAns);
return 0;
}
|
cs |
이 문제는 규칙을 찾아보려고 부단히 노력했지만 그냥 순열을 통해 숫자들이 나열될 수 있는 경우의 수를 모두 찾아 그 차이가 최대인것을 찾아내면 됐다.
순열 들어가기 전에 정렬을 해주는 것은 먼저 정렬해주지 않으면 나올 수 있는 경우의 수가 끝까지 나오지 않을 수 있어서 먼저 정렬하고 -> 순열을 찾아주는것이 중요하다.
순열을 구현하는 방법은 두가지가 있는데 첫번째는 재귀+swap이고 두번째는 백트래킹이다.
재귀+swap으로 풀어봤는데 다른 사람의 코드를 참고했기에 아래 첨부해두었다. 재귀를 통해서 계속 반복하는 과정인데 너무 길어서 그냥 코드 자체는 간단하니 외우려 한다..ㅋㅋㅋ
백트래킹
algorithm 헤더에 next_permutation이 포함되어있다. 백트래킹을 쓰지 않은 이유는 순열을 출력할 때는 매우 편리한 것같은데 문제에서는 차이를 최대로 하라는 조건이 있어서 재귀와 swap을 썼다.
순열 참고 사이트
https://ansohxxn.github.io/algorithm/permutation/
(C++) 순열(Permutation) 구현하기
순열은 완전 탐색(브루트 포스) 문제에서 많이 등장하므로 잘 익혀놓자.
ansohxxn.github.io
728x90
반응형
'알고리즘 > 완전탐색' 카테고리의 다른 글
[C++ 백준] 실버 5/1436번 영화감독 숌 (0) | 2022.02.21 |
---|---|
[java 백준] 골드 1/ 2098번 외판원 순회 2 (0) | 2022.02.20 |
[java 백준] 골드 5/1451번 직사각형으로 나누기 (0) | 2022.02.17 |
[java 백준] 골드 5/1107번 리모컨 (0) | 2022.02.13 |
[java 백준] 실버 5/ 1476번 날짜계산 (0) | 2021.08.30 |
댓글