본문 바로가기

BOJ/C++

BOJ [C++]) 10819번 차이를 최대로

728x90

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

 

10819번: 차이를 최대로

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

www.acmicpc.net

 

1. 문제 

- N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.

 

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

 

 

2. PS

- 가장 큰 수를 덱에 넣고 그 좌우로 가장 작은수와 다음 작은수를 넣음.

- 가장 작은수 옆에는 가장 큰 수의 다음 큰 수를 넣어서 풀려고 함 .. (설명 힘듬..)

- 주어진 배열이 홀수 일때는 마지막 수와 양 끝의 수를 비교해서 차이가 더 큰쪽으로 붙여줌.

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

int main() {
    int n;
    int sum = 0;
    deque<int> dq;
    deque<int> dq2;
    cin >> n;
    for(int i = 0; i < n; i++) {
        int num;
        cin >> num;
        dq.push_back(num);
    }
    sort(dq.begin(), dq.end());
    
    dq2.push_back(dq.back());
    dq.pop_back();
    while(1) {
        dq2.push_back(dq.front());
        dq.pop_front();
        if(dq.size()==1) break;
        dq2.push_front(dq.front());
        dq.pop_front();
        if(dq.size()==1) break;
        dq2.push_back(dq.back());
        dq.pop_back();
        if(dq.size()==1) break;
        dq2.push_front(dq.back());
        dq.pop_back();
        if(dq.size()==1) break;
    }

     if(n%2) {
           if(abs(dq.back() - dq2.back()) > abs(dq.back()- dq2.front())) {
             dq2.push_back(dq.back());
         }
          else dq2.push_front(dq.back());
      }
     else dq2.push_back(dq.back());
    
    
    for(int i = 1 ; i < dq2.size(); i++) {
        int tmp = abs(dq2[i-1] - dq2[i]);
        sum += tmp;
    }

    cout << sum;
    
}

- 코드가 좀 더럽다..

- algorithm 라이브러리의 next_permutation를 사용하면 더 간편하게 짤 수 있었음.. (나중에 알았습니다.)

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

int main() {
    int n;
    cin >> n;
    vector<int> v;
    
    for(int i = 0 ; i < n; i++) {
        int num;
        cin >> num;
        v.push_back(num);
    }
    sort(v.begin(), v.end());
    
    int ans = 0;
    while(next_permutation(v.begin(), v.end())) {
        int sum = 0;
        for(int i = 1 ; i < v.size(); i++) {
            sum += abs(v[i] - v[i-1]);
        }
        
        ans = max(sum, ans);
    }



    cout << ans;
    
}

-주의점은 next_permutation 함수를 사용하기 전에 sort를 해주어야 한다는 것.

'BOJ > C++' 카테고리의 다른 글

BOJ [C++]) 1966번 프린터 큐  (0) 2021.12.30
BOJ [C++]) 10166번 관중석  (0) 2021.12.30
BOJ [C++]) 10825번 국영수  (0) 2021.12.23
BOJ [C++]) 10799번 쇠막대기  (0) 2021.12.23
BOJ [C++]) 11652번 카드  (0) 2021.12.23