백준 #11399 ATM
문제 설명👩🏫
총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.
줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.
각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구해라.
입력
5
3 1 4 3 2
출력
32
내 코드💻
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = Integer.parseInt(str);
int[] time = new int[n];
int sum = 0;
str = br.readLine();
StringTokenizer st = new StringTokenizer(str, " ");
for(int i=0;i<n;i++){
time[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(time);
for(int i=0;i<n;i++){
sum += time[i] * (n-i);
}
System.out.println(sum);
}
}
설명💡
최소 시간을 구하기 위해서는 중복되서 합쳐지는 수를 작게 만드는 게 좋기 때문에, 각각의 시간을 입력받아 정렬시키고, 각각의 시간이 전체 sum에서 중복되는 횟수만큼 곱해서 sum을 구했다.
느낀 점 및 궁금한 점🍀
이게 그리디 알고리즘을 써서 한건지 그냥 정렬을 한건지,,, 그리디 알고리즘은 어떻게 써야할지 아직 잘 모르겠다. 더 공부해야할 부분이다..😟