문제 링크
https://www.acmicpc.net/problem/11399
11399번: ATM
첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)
www.acmicpc.net
풀이
- dp로 풀이
- 걸리는 시간이 작은 사람부터 실행하면 되므로 data를 오름차순 정렬해준다.
dp[i] 는 i번째 사람이 돈을 인출하는 데 필요한 시간
dp[i] = dp[i-1] + data[i]
- dp의 합 출력
import sys
input = sys.stdin.readline
n = int(input())
data = list(map(int,input().split()))
data.sort()
dp = [0] * n
dp[0] = data[0]
for i in range(1,n):
dp[i] = dp[i-1] + data[i]
print(sum(dp))
- 과거에 해당 문제를 푼 적이 있는데 dp로 메모제이션하지 않고
아래 코드처럼 data[i+1] = data[i+1]+data[i] 로 풀었다.
- dp로 풀었을 때 68ms가 걸렸고, 아래처럼 풀었을 경우 132ms가 걸린 것으로 보아 dp 훨씬 빠르다
n = int(input())
data = list(map(int,input().split()))
data.sort()
if n == 1:
print(n)
else :
for i in range(len(data)-1):
data[i+1] += data[i]
print(sum(data))
'개발 > algorithm' 카테고리의 다른 글
[백준 11726번] 2 x n 타일링 - python (0) | 2022.02.14 |
---|---|
[백준 11659번] 구간 합 구하기 4 - python (0) | 2022.02.14 |
[백준 11047번] 동전 0 - python (0) | 2022.02.14 |
[백준 9461번] 파도반 수열 - python (0) | 2022.02.14 |
[백준 17626번] Four Squares - python (0) | 2022.02.14 |