포스트

(백준/C++) 11399_ATM

11399번: ATM (acmicpc.net) 문제는 탐욕(그리디) 알고리즘으로 풀 수 있는 문제입니다.

탐욕 알고리즘(Greedy Algorithm)이란, 매 순간 최적이라고 생각되는 방법을 선택하는 방식으로 문제를 해결하는 알고리즘입니다.

즉, 다른 경우의 수가 없이 현 문제에서 가장 좋아 보이는 것을 선택해 나가다보면 문제가 풀리는 알고리즘 입니다.

따라서, ATM 문제는 각 사람이 돈을 인출하는데 걸리는 시간을 최소화하면 전체 시간도 최소화 됩니다.


접근법

이 문제의 핵심은 “각 사람이 돈을 인출하는데 걸리는 시간을 최소화하면 전체 시간도 최소화된다” 는 것입니다.

따라서 각 사람이 돈을 인출하는 시간을 오름차순으로 정렬하면, 앞 사람이 돈을 인출하는 시간이 최소가 되므로 전체 시간도 최소가 됩니다.


풀이

각 사람이 돈을 인출하는 시간을 오름차순으로 정렬한 후, 각 사람이 돈을 인출하는 데 필요한 시간을 누적하여 계산합니다.

이렇게 하면 각 사람이 돈을 인출하는 데 필요한 시간의 합의 최솟값을 구할 수 있습니다.

이때, 현재 사람이 인출하는 데 걸리는 시간을 남은 사람에게 전부 누적해 가면 각 사람이 돈을 인출하는 데 필요한 총 누적 시간이 계산 됩니다.

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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int N, result = 0;
	cin >> N;

	vector<int> times(N);
	for (int i = 0; i < N; i++)
		cin >> times[i];

	sort(times.begin(), times.end());

	for (int i = 0; i < N; i++)
	{
		result += times[i] * (N - i); // 누적 합을 이용하여 나머지 대기 인원에 현재 시간을 전부 추가한다.
	}

	cout << result;
}
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.