카테고리 없음

[Python] 백준 풀기 11399 - ATM

XEV 2022. 10. 8. 20:35

파이썬 백준 11399번

실버4

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

 

11399번: ATM

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

www.acmicpc.net

 

 

 

 

문제 보기

분류: 그리디 알고리즘, 정렬

 

 

 

문제 풀기

줄 서있는 각 사람마다 특정 인자가 더 언급되지 않을까 했는데 그런건 없었다. 그래서 사람의 특성은 생각하지 않고 인출 시간만 고려하면 되기에 고민없이 코드를 작성할 수 있었다.

리스트로 인출 시간을 모두 입력 받은후 오름차순으로 정렬을 한다.

그리고, 지정해준 사람 수 N 개에 대해 for 문을 돌리면 되는데 변수 N 은 사용하지 않고 리스트의 원소를 하나하나 불러 오는 식으로 for loop 를 돌렸다.

이 때, 매 인출 시간은 누적되어 t_sum 에 저장되어지고, 이 누적 시간은 모든 사람들의 인출 시간 합이 되기때문에 total_sum 에 다시 누적되어 저장되도록 하였고, loop 가 다 돌고나면 최종 결과 total_sum 이.출력 되도록 하였다.

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

N = int(inputdata().strip())
time_ls = list(map(int, inputdata().split()))

# print(time_ls)          #
time_ls.sort()
# print(time_ls)          #

t_sum = 0
total_sum = 0
for t in time_ls:
    t_sum += t
    total_sum += t_sum

print(total_sum)

 

 

추가 하기

풀이 후 공부하게된 더 잘짠거 같은 코드

import sys
inputdata = sys.stdin.readline

N = int(inputdata().strip())
time_ls = list(map(int, inputdata().split()))

# print(time_ls)          #
time_ls.sort()
# print(time_ls)          #

total_sum = 0
for i in range(1, N + 1):
    total_sum += sum(time_ls[:i])           # i 가 변경 되면서 리스트 index 0 부터 index i 까지 합을 나타내는 코드

print(total_sum)

매번 누적되는 인출 시간의 합을 리스트 합으로 표현 하였는데 이때, 다이나믹한 변수 i 에 종속되어있는 형태 sum(time_ls[:i]) 로 표현 할 수 있음을 알게 되었다. 그런데 sum() 함수가 코드 동작 시간을 줄이는데 좋지 않았던 이전 경험이 있어서 아마 이 코드는 시간적 손해를 보긴 할거다.