알고리즘 BOJ
백준 11399 파이썬 | ATM
콘2조아
2021. 8. 31. 20:02
코드
from sys import stdin
input = stdin.readline
lst = []
N = int(input())
lst = list(map(int, input().split()))
lst.sort()
ans = 0
for i in range(N):
ans += lst[i] * (N-i)
print(ans)
설명
각 사람은 돈을 뽑는데 자신 숫자만큼의 시간이 걸린다. 예를 들어 4라는 사람은 4분이 걸리는 식이다. 1 2 3이 줄을 서 있으면 1은 돈을 뽑기까지 1분, 2는 1이 돈을 뽑는 시간을 기다린 다음 자신이 돈을 2분동안 뽑으니 돈을 뽑기까지 걸리는 시간은 3분, 3은 돈을 뽑기까지 6분이 걸린다. 각 사람이 돈을 뽑기까지 기다린 시간의 합은 10분이 되는 것이다. 문제에서는 이 모두 합한 시간의 최솟값을 구하라고 요구한다.
이 문제는 어렵지 않게 풀 수 있었다. 돈을 뽑는데 드는 시간이 가장 적은 사람 순서로 줄을 서면 된다. 이유를 덧붙이자면 만약 5명이 있다고 했을 때 1번 사람이 돈을 뽑을 동안 뒤의 4명이 그 시간동안 기다려야 하고, 2번 사람이 돈을 뽑을 때는 뒤의 3명이 그 시간을 기다려야 하기 때문이다. 문제에서 든 예시를 봐도 1이 다섯 번, 2가 네 번 3이 세 번 ... 하는 식으로 나온다.
코드를 짜는 방법은 어렵지 않다. 먼저 기다리는 시간을 리스트에 담아 정렬한다. 앞선 설명대로 맨 앞 사람의 기다리는 시간 부터 N-i 를 곱해 더해주면 답이 된다.
메모리: 29200 KB
시간: 68 ms
문제
https://www.acmicpc.net/problem/11399
11399번: ATM
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net