study/coding test
백준 11399 - ATM
Acver
2021. 12. 16. 15:03
1. 문제 정리
- N명의 사람과 각 사람의 인출하는데 걸리는 시간 Pi가 주어진다.
- 한번에 한명만 인출이 가능하며, 그 외의 사람은 기다려야 한다.
- 각 사람들의 (기다리는 시간+인출하는 시간)의 합이 최소가 되도록 한다.
2. 접근
- 그리디 알고리즘으로 풀 수 있다.
- 뒷 사람의 기다리는 시간을 짧게 한다 = 그 앞의 사람의 인출 시간을 짧게 한다. 로 볼 수 있다.
- 즉, 인출 시간이 가장 빠른 사람을 앞으로, 가장 느린 사람을 뒤로, 즉 오름차순으로 정렬하여 순서대로 인출시킨다.
- 앞에서 풀었던, (백준 1931 - 희의실 배정) 문제와 유사하다.
3. 풀이
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n;
vector<int> p;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cin >> n;
for(int i = 0; i < n; i++){
int input;
cin >> input;
p.push_back(input);
}
sort(p.begin(), p.end());
int waitT = 0;
int ans = 0;
for(int i: p){
waitT = i+waitT;
ans += waitT;
}
cout << ans;
}
- int waitT : 각 순간의 대기자의 대기 시간과 인출 시간의 합을 저장한다.
- int ans : 소요시간의 합을 저장한다.
4. 소감
난이도가 어려운 문제는 아니었다. 이런 문제가 그리디 알고리즘으로 푸는 문제구나 라고 감을 잡을 수 있는 풀기 편한 난이도의 문제였다고 생각한다. 그리디 알고리즘을 처음 접한다면 이 정도 수준의 문제로 익숙해져 나가는 것도 좋을 거라 생각한다.