728x90
1. 링크
https://www.acmicpc.net/problem/11399
2. 난이도(solved.ac 참고)
실버3
3. 풀이
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
n = int(input()) | |
m = list(map(int, input().split())) | |
m.sort() | |
process_time = [0 for _ in range(n)] | |
total_process_time = 0 | |
for i in range(n): | |
if i == 0: | |
process_time[i] = m[0] | |
total_process_time = m[0] | |
else: | |
process_time[i] = process_time[i-1] + m[i] | |
total_process_time += process_time[i] | |
print(process_time) |
이 문제는 처음에 봤을 때부터 어떻게 풀어야 할 지 바로 머릿속에 떠올랐다. 가장 시간이 적게 들게 하려면, 걸리는 시간을 sort하여 가장 작은 값이 맨 앞에 오도록 해야 한다. 그래야 오래 걸릴수록 뒤로 가서, 전체 시간(돈 뽑는 시간 + 대기시간)을 줄일 수 있기 때문이다.
우선 배열 m을 sort했고, 각 사람들의 소요시간 process_time, 전체 소요시간 total_process_time을 각각 배열, 숫자 로 선언했다.
첫 번째 사람은, 기다리는 시간이 없기 때문에 돈을 뽑는 시간 m[0]만 더해주고, 이는 전체 소요시간(total_process_time)에도 해당한다.
이제 두 번째 사람부터 else문에 해당하는데, 두 번째 사람부터는 (앞 사람이 인출하는 데 걸린 시간)만큼 기다려야 하고, 그 이후 (본인의 인출 시간) 만큼 소요된다. 전자가 process_time[i-1]이고, 후자가 m[i]이다. 그리고 이 process_time[i]가 구해질 때마다 이를 total_process_time에 더해준다.
'CS > 알고리즘' 카테고리의 다른 글
[Python] BOJ(백준) 2217번 - 로프 (+ sys.stdin.readline의 중요성) (0) | 2021.06.28 |
---|---|
[Python] BOJ(백준) 9237번 - 이장님 초대 (0) | 2021.06.27 |
[Python] 최단 거리 구하기(BFS) (0) | 2021.06.01 |
[Python] 친구 관계(DFS) (0) | 2021.06.01 |
[Python] 미로 찾기(BFS) (0) | 2021.06.01 |