본문 바로가기
코딩 테스트/백준

[백준][C++]11399-ATM

by 계양구놈팽이 2022. 5. 27.

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

사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라진다고 한다. 예시에서도, 인출 하는데 소요되는 시간이 가장 적은 2번 사람이 먼저 돈을 인출하고, 차례로 5번,1번,4번 그리고 마지막으로 3번사람이 돈을 인출 할 때 시간의 합의 최솟값을 얻을 수 있다고 한다.

그렇다면, 둘째 줄에 주어진 시간 데이터를를 오름차순으로 정렬한다면 간단하게 원하는 순열을 얻을 수 있다.

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

int main()
{
    int n, a;
    std::vector<int> data;
    std::vector<int> sum_data;
    cin >> n;
    //데이터 입력
    for (int i = 0; i < n; i++)
    {
        cin >> a;
        data.push_back(a);
    }
    // sort함수를 이용해서 vector안의 값을 오름차순 정렬
    sort(data.begin(), data.end());
    int sum(0);
    // 누적된 합을 순차적으로 또 하나의 vector에 저장
    for (auto& d : data)
    {
        sum += d;
        sum_data.push_back(sum);
    }
    //accumulate 함수를 사용하면 vector안의 숫자의 합을 얻을 수 있다. 세번째 인자는 sum의 default 값이다. 0 + vector의 합
    sum = std::accumulate(sum_data.begin(), sum_data.end(), 0);

    cout << sum;

    return 0;
}