풀기 전 :
이 문제는 어떨 때 가장 최적인 경우인지 친절히 알려준다 사용 시간이 짧은 사람을 앞으로 정렬 해주고 더해주면 가장 짧은 시간이 된다.
자바(JAVA)
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
import java.util.Collections;
public class Main{
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
int arr[]=new int[n];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
}
Arrays.sort(arr);
int waitingTime=0;
int total=0;
for(int i=0;i<n;i++){
waitingTime+=arr[i];
total+=waitingTime;
}
System.out.println(total);
}
}
C++
include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
int main(void) {
int n;
cin >> n;
int* arr = new int[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr + n);
int waitingTime = 0;
int total = 0;
for (int i = 0; i < n; i++) {
waitingTime += arr[i];
total += waitingTime;
}
cout << total;
}
6개월 후에 다시 풀었을때:
기다리는 시간이 짧은 사람을 먼저 앞에 둘 수록 계속 누적되는 값이 작아진다고 볼 수 있으므로 그리디문제임을 인식하고 풀었다.
import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int p[]=new int[n+1];
int waitingTime[]=new int[n+1];
p[0]=0;
for(int i=1;i<=n;i++){
p[i]= scanner.nextInt();
}
Arrays.sort(p);
for(int i=1;i<=n;i++){
waitingTime[i]=waitingTime[i-1]+p[i];
}
int sum=0;
for(int i=1;i<=n;i++){
sum+=waitingTime[i];
}
System.out.println(sum);
}
}
위와 비슷한 것같다.