포스트

백준 11399. ATM

ATM

간단한 그리디 문제

1. 간단 설명


image

ATM이 한대밖에 없어서, 사람들이 줄을 서서 인출하는 상황

사람의 수와, 그 사람이 인출하는데 걸리는 시간이 주어진다

첫째 줄에 사람의 수 N이 주어지고

둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다.

각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력하는 문제

2. 예시


P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 이 주어졌다면

[1,2,3,4,5] 순서로 줄을 섰을 땐,

1번은 3분

2번은 3분 + 1분 = 4분

3번은 3 + 1 + 4 = 8분

4번 : 3 + 1 + 4 + 3 = 11

5번 : 11 + 2 = 13

12345로 섰을 때 전체 시간의 합은 3 + 4 + 8 + 11 + 13 = 39분이 된다

3. 알고리즘


최대 사람 수는 1000명이므로

각 경우의 수마다 직접 구하는건 1000! 돌려야 하므로 1초 내에 불가능하다

쇼핑대에서 계산할때 생각해보면, 가장 계산시간이 적은 사람한테 먼저 양보하는게 결과적으로 빨랐다

이를 이용해서 계산시간이 적은 사람을 앞에 배치하는 방법을 사용

3 1 4 3 2 를 오름차순으로 정렬하면 1 2 3 3 4

이 경우에는 1 + (1+2) + (1+2+3) + (1+2+3+3) + (1+2+3+3+4) = 32 이다

필요 변수

  • int N
  • int P[1001] 각 사람이 걸리는 시간
  • int res 결과값 저장용

4. 소스코드


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
#include <iostream>
#include <algorithm>

using namespace std;

int N;
int P[1001];

int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> P[i];
	}
	sort(P, P + N);

	int res = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j <= i; j++) { // 누적합
			res += P[j];
		}
	}
	cout << res;

	return 0;
}

방법만 떠올리면 매우 간단한 그리디 문제였다

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.