배열에 들어 있는 값들을 이동시키며 바로 옆 칸과의 차이의 절대값의 최대를 출력하는 문제
조건에 주어진 수의 최대가 8인걸로 보아 시간복잡도가 복잡한 알고리즘도 대입할 수 있을 것으로 보인다. 그렇기 때문에 순열을 이용한 n!의 시간복잡도를 가지는 알고리즘을 사용한다. 시간복잡도는 순열을 구하는데 n! 그리고 각 순열을 구할 때마다 n번의 for문을 돌기 때문에 O(n*n!)의 값이 나온다.
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 | #include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int input; vector<int> perm; cin >> input; for (int i = 0; i < input; ++i) { int n_input; cin >> n_input; perm.push_back(n_input); } int ans = -500000; //첫 순열부터 시작하기 위해 정렬 sort(perm.begin(), perm.end()); do { int new_ans = 0; for (int i = 1; i < input; ++i) { new_ans += abs(perm[i] - perm[i - 1]); } ans = max(ans, new_ans); } while (next_permutation(perm.begin(), perm.end())); cout << ans << endl; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 10971: 외판원 순회2 (0) | 2018.07.17 |
---|---|
백준 2529: 부등호 (0) | 2018.07.17 |
백준 10974: 모든 순열 (0) | 2018.07.17 |
백준 10973: 이전 순열 (0) | 2018.07.17 |
백준 10972: 다음 순열 (0) | 2018.07.17 |