문제링크: https://www.acmicpc.net/problem/11399

 

♣ 문제정리

사람의 수 N

i번째 사람이 돈을 인출하는 데 걸리는 시간 : 입력값 (1,2,3...N)

순서를 아무렇게나 할 수 있음

각 사람이 돈을 인출하는 데 걸리는 총 시간의 최소값: 출력값

 

 

♣ 코드 작성 전 생각할 거리

경우의 수: N!

총 시간이 최소인 경우의 순서를 알 필요는 없다.

가장 오래 걸리는 사람을 조금 더하고, 가장 적게 걸리는 사람을 가장 많이 더해야지 총 합이 최소

-> 정렬!

 

 

 

♣ 코드 작성

총 시간을 구하려면 배열에서 각 원소에 왔을 때 처음부터 그 순서까지를 계속 더해야 한다

i:0 -> 0

i:1 -> 0, 1

i:2 -> 0,1,2

i:3 -> 0,1,2,3

i:4 -> 0,1,2,3,4

 

이것에 충실하게 코드를 작성했다

n = int(input())

# fetch하는 time 넣을 리스트
f_times = list(map(int, input().split(' ')))

f_times.sort()

sum = 0
k=1

while(k <= n):
    for i in range(0, k):
        sum = sum + f_times[i]
    k += 1

print(sum)

 

 

하지만, 조금만 더 생각해 보면,

sum이나 k라는 변수를 따로 만들지 않아도 배열을 순차적으로 갱신해주는 방법도 있다!

우리가 구해야 하는 것은 소요시간들의 합이기 때문에 각 배열의 원소들을 이전 원소들을 더한 합으로 바꿔준다. 

=> 순차적으로 각 원소는 (자신의 값 + 이전 원소값)으로 바꿔준다.

그리고 바뀐 배열들의 합을 구해도 같은 답이 나오게 된다.

for i in range(1, n):
    f_times[i] += f_times[i-1]
print(sum(f_times))

코드길이도 많이 줄었고 시간은 거의 절반으로 줄어듬을 알수 있다!!!!!!

memoization을 사용한 방법

동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 하는 기술! 동적 계획법의 핵심

 

 

코드를 작성하러 들어가기 전에 어떻게 작성할 건지를 확실하게 하는 게 시간을 절약하는 데 중요하다!

즉, 코드 작성보다는 문제를 분석하는 데에 시간을 더 투자하자

'알고리즘 공부 > coding test' 카테고리의 다른 글

백준 1931 [회의실 배정]  (0) 2022.05.20
백준 20115 [에너지 드링크]  (0) 2022.05.20
백준 2217[로프]  (0) 2022.05.17
백준 2358 [평행선]  (0) 2022.02.08
백준 2609 [최대공약수와 최소공배수]  (0) 2021.02.04

+ Recent posts