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

github : https://github.com/junho0956/Algorithm/blob/master/10819/10819/%EC%86%8C%EC%8A%A4.cpp

 

완전탐색으로 가능한 모든 경우를 탐색하였으며

범위가 작아서 그런지 빠른 시간내로 해결했습니다.

탐색간 배열을 계속 만들어주어서 수를 확인하고 수가 없다면 삽입 후 넘기는 방식으로 코드하였습니다.

 

next_permutation (조합) 으로 구할 수 있지만 

아직 사용법과 내부 구현을 몰라서 공부 후에 적용해보겠습니다.

 

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
#include <iostream>
#include <algorithm>
using namespace std;
 
 
int arr[8];
int p[101];
int m[101];
int N, Max;
 
void ans(int v[], int index) {
    
    int vv[8];
    for (int i = 0; i < index; i++) vv[i] = v[i];
 
    if (index == N) {
        int total = 0;
        for (int i = 0; i < N - 1; i++) total += abs(vv[i] - vv[i + 1]);
 
        Max = max(Max, total);
        return;
    }
 
    for (int i = 0; i < N; i++) {
        int cnt = 0;
        for (int k = 0; k < index; k++) {
            if (vv[k] == arr[i]) cnt++;
        }
        if (arr[i] == 0 || arr[i] > 0) {
            if (cnt != p[arr[i]]) {
                vv[index] = arr[i];
                ans(vv, index + 1);
            }
        }
        else {
            if (cnt != m[arr[i]*-1]) {
                vv[index] = arr[i];
                ans(vv, index + 1);
            }
        }
    }
}
 
int main() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> arr[i];
        if (arr[i] == 0) p[0]++;
        else if (arr[i] > 0) p[arr[i]]++;
        else m[arr[i]*-1]++;
    }
 
    for (int i = 0; i < N; i++) {
        int v[8];
        ans(v, 0);
    }
 
    cout << Max;
    return 0;
}

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

BOJ 12851번 숨바꼭질2  (0) 2020.01.22
BOJ 1697번 숨바꼭질  (0) 2020.01.22
BOJ 2410번 2의 멱수의 합  (0) 2020.01.22
BOJ 1451번 직사각형으로 나누기  (0) 2020.01.21
BOJ 1107번 리모컨  (0) 2020.01.21

+ Recent posts