1. 문제 링크

www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

 

2. 문제 설명

줄을 서 있는 사람의 수와 각 사람이 돈을 인출하는데 걸리는 시간을 입력받은 후,

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

 

 

 

3. 소스코드

BOJ 11399번 ATM C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, P;
	vector<int> v;

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> P;
		v.push_back(P);
	}

	sort(v.begin(), v.end());
	int result = 0;
	for (int i = 0; i < N; i++)
		// for (int j = 0; j <= i; j++)
		// 	result += v[j];
		result += v[i] * (N - i);
	cout << result;

	return 0;
}

 

20번 라인 : 최솟값을 구하려면 돈을 인출하는데 필요한 시간이 적게 걸리는 사람부터 인출해야 하므로 오름차순으로 정렬합니다.

22 ~ 24번 라인 : 3명의 사람이 있다고 가정하고 돈을 인출하는데 필요한 시간을 오름차순으로 정렬했다고 가정하면,

v[0], v[0] + v[1], v[0] + v[1] + v[2]이므로 이중 for문을 이용하여 구할 수 있습니다.

25번 라인 : 위의 예제를 살펴보면 v[0]은 3번, v[1]은 2번, v[2]는 1번 더하는 것을 알 수 있습니다.

따라서 23, 24번 라인의 for문을 사용하지 않고, 25번 라인의 식을 이용하여 단일 for문으로도 풀 수 있습니다.

+ Recent posts