카테고리 없음

백준 11399 - ATM

bellhundred 2022. 1. 9. 15:59

https://www.acmicpc.net/problem/11399

 

11399번: ATM

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

www.acmicpc.net

n = int(input())
arr= list(map(int, input().split()))

arr.sort()
time_arr = []
for i in range(len(arr)):
    t = sum(arr[:i+1])
    time_arr.append(t)

print(sum(time_arr))

문제 안에 솔루션이 담겨 있는 문제다. 다시 말해서, 시간 소요가 적은 사람들부터 우선적으로 ATM을 해결할 수 있게 하는 경우의 수가 전체 이용인원의 이용시간의 합을 최소로 만들 수 있는 경우의 수라는 이야기가 된다.

 

그렇기 때문에 시간소요가 적은 사람들부터 쓸 수 있게, sort를 먼저 해 주고,

a[0]번째로 쓰는 사람은 0번이 이용하는 시간만을 더해주고 time_arr에 그 값을 저장한다.

a[1]번째로 쓰는 사람은 0+1번이 이용하는 시간을 더해주고 time_arr에 그 값을 저장한다.

a[2]번쨰로 쓰는 사람은 0+1+2번이 이용하는 시간을 더해주고 time_arr에 그 값을 저장한다.

...

이후 time_arr의 각 값의 합계를 출력한다.

 

greedy_algorithm 문제인데, 그 중 가장 기초적인 내용을 담은 데다가 어떻게 하면 greedy하게 선택할 수 있는지를 문제에서 알려줘서 쉽게 풀 수 있는 문제다.