https://www.acmicpc.net/problem/11399
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> WaitingLine(n);
for (int i = 0; i < n; i++)
{
cin >> WaitingLine[i];
}
//for (auto a : WaitingLine) cout << a << " ";
sort(WaitingLine.begin(), WaitingLine.end());
//for (auto a : WaitingLine) cout << a << " ";
int temp = 0;
int MinSum=0;
for (int i = 0; i < n; i++)//1 2 3 3 4
{
temp += WaitingLine[i];
MinSum += temp;
}
//1
//1+2 =4
//1+2+3 =10
//1+2+3+3 =19
//1+2+3+3+4 =13
cout << MinSum << endl;
return 0;
}
순열(모든 경우의 줄 서는 순서)을 사용하여 해결하는 방법도 가능하지만, 너무 비효율적
💡 N이 1,000일 때, 순열의 경우의 수는 1000!(팩토리얼)이므로 현실적으로 계산 불가능! 😱
따라서, 그리디 알고리즘(Greedy Algorithm)을 사용하여 O(N log N) 시간복잡도로 해결하는 것이 최적
5
3 1 4 3 2
1 2 3 3 4
1 → 1
1+2 = 3 → 1+3
1+2+3 = 6 → 1+3+6
1+2+3+3 = 9 → 1+3+6+9
1+2+3+3+4 = 13 → 1+3+6+9+13
✔ 출력값: 32
✅ 순열(O(N!))을 사용하면 시간 초과 → 대신 O(N log N) 그리디 방식 사용!
✅ 작은 값부터 먼저 처리하면 전체 최소 대기 시간을 만들 수 있음!
✅ 정렬 + 누적합 활용하여 최적해를 빠르게 구할 수 있음! 🚀
BJ9251 LCS(Longest Common Subsequence, 최장 공통 부분 수열) (0) | 2025.02.19 |
---|---|
백준 11053 가장 긴 증가하는 부분 수열 LIS+DP (0) | 2025.02.18 |
백준 27961 마도카 고양이 (0) | 2025.02.11 |
백준 // 15686// 치킨 거리 //완전 탐색 하기~ (0) | 2025.02.07 |
백준 2615 //오목 (0) | 2025.02.06 |