파이썬 백준 11399번
실버4
https://www.acmicpc.net/problem/11399
문제 보기
분류: 그리디 알고리즘, 정렬
문제 풀기
줄 서있는 각 사람마다 특정 인자가 더 언급되지 않을까 했는데 그런건 없었다. 그래서 사람의 특성은 생각하지 않고 인출 시간만 고려하면 되기에 고민없이 코드를 작성할 수 있었다.
리스트로 인출 시간을 모두 입력 받은후 오름차순으로 정렬을 한다.
그리고, 지정해준 사람 수 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() 함수가 코드 동작 시간을 줄이는데 좋지 않았던 이전 경험이 있어서 아마 이 코드는 시간적 손해를 보긴 할거다.