티스토리 뷰


문제

 

11399번: ATM

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

www.acmicpc.net


풀이

문제 설명이 긴데, 시각적으로 봐야 이해가 쉽다.

처음에 [3, 1, 4, 3, 2] 순으로 배열의 1번 사람은 3분만에 돈을 뽑을 수 있고

마지막 5번 사람은 나머지가 돈을 다 뽑은 후인 3 + 1 + 4 + 3 분 후에 2분을 들여 돈을 뽑을 수 있다.

이를 통해 총 인출 시간은 아래처럼 나타낼 수 있다.

 

3 + (3 + 1) + (3 + 1 + 4) + (3 + 1 + 4 + 3) + (3 + 1 + 4 + 3 + 2)

 

그런데, 인출에 필요한 시간의 최솟값을 구하려면, 반복되는 숫자를 작게 만들어야 한다.

오름차순으로 배열하면 최솟값을 구할 수 있다.

 

위의 설명을 식으로 만들면

첫번째 수 * 반복되는 만큼

결과 += 숫자리스트[i번째] * ( 총 숫자 - i ) 를 for문에 넣으면 된다.

 

import sys
n = int(sys.stdin.readline())
list = list(map(int, sys.stdin.readline().split()))
list = sorted(list)
result = 0

for i in range(n):
    result += list[i]*(n - i)
print(result)

 

반응형
댓글