문제 주소 : https://www.acmicpc.net/problem/11399
정답 비율 : 66.057% (2021.06.26 14:14 기준)
11399번: ATM
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net
문제 조건 :
입력 : 첫 줄에는 사람의 수(n), 두 번째 줄에는 n명의 사람이 돈 인출하는데 걸리는 시간
출력 : 각 사람이 인출하는데 걸리는 시간의 합의 최솟값
시간 : 1초
문제 풀이 :
전형적인 그리디 알고리즘 문제로 Optimal Storage on tapes에 해당합니다.
예를 들어 3명이 존재하고 각 사람이 돈 인출하는데 걸리는 시간을 a, b, c로 하겠습니다. 하고 a -> b -> c 순서대로 돈을 인출한다고 가정하겠습니다.
이때 각 순서에 해당하는 사람이 인출하는데 걸리는 시간은 다음과 같습니다.
첫 번째 순서 : a
두 번째 순서 : a + b
세 번째 순서 : a + b + c
수식으로 표시 : 총합 = a * 3 + b * 2 + c * 1
이를 일반화하면 다음과 같습니다. (n : 사람의 수, Vi : i번째 사람이 인출하는데 걸리는 시간)
총합 = V1 * (n - 1 + 1) + V2 * (n - 2 + 1) + V3 * (n - 3 + 1) + ... + Vn * ( n - n + 1)
또한 수식을 보면 뒷 순서일수록 곱하는 값이 작아지는 것을 확인할 수 있습니다.
따라서 최솟값을 구하려면 앞사람의 인출 시간은 뒷사람의 인출 시간보다 작아야 합니다. (오름 차순 정렬)
코드는 다음과 같습니다.
Python3
# solve 11399
size = int(input())
person = list(map(int, input().split()))
person.sort()
ans = 0
for p in person:
ans += p * size
size -= 1
print(ans)
'Algorithm Trainning > 백준 알고리즘(BEAKJOON)' 카테고리의 다른 글
| 백준 : 3273번, 두 수의 합 (0) | 2021.06.28 |
|---|---|
| 백준 : 8980번, 택배 (0) | 2021.06.27 |
| 백준 : 2579번, 계단 오르기 (0) | 2021.05.04 |
| 백준 : 1316번, 그룹 단어 체커 (0) | 2021.05.02 |
| 백준 : 2667번, 단지번호붙이기 (0) | 2021.05.02 |