정수 배열 A와 B가 있을 때, S = A[0] X B[0] + ... + A[N-1] X B[N-1]이다.
S의 값을 가장 작게 만들기 위해 A 배열만 재배열할 것이다.
이렇게 구한 최소값 S를 구하는 문제이다.
사실 A만 변경시키라고 했지만, A와 B를 동시에 배열시켜도 문제 없다.
A를 오른쪽으로 2칸 이동시킨 것은 곧 A를 오른쪽으로 1칸 이동시키고, B를 왼쪽으로 1칸 이동시킨 것과 같은 결과를 낸다.
S 값을 최소로 만들기 위해서는 A를 오름차순으로 재배열하고, B를 내림차순으로 재배열하여 일치하는 Index끼리 곱해줘서 더해주면 된다.
이럴 경우 A의 최솟값은 B의 최댓값과 곱해지고, B의 최솟값은 A의 최댓값고 곱해지며 S를 최소화 시킬 수 있을 것이다
(A와 B의 원소가 음이 아닌 정수여서 가능한 방법)
import java.io.*;
import java.util.*;
public class Main {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) {
FastReader sc = new FastReader();
int n = sc.nextInt();
Integer[] A = new Integer[n];
Integer[] B = new Integer[n];
for(int i =0;i<n;i++) {
A[i] = sc.nextInt();
}
for(int i =0;i<n;i++) {
B[i] = sc.nextInt();
}
Arrays.sort(A);
Arrays.sort(B, Collections.reverseOrder());
// A를 오름차순 정렬 & B를 내림차순 정렬
int answer = 0;
for(int i =0;i<n;i++) {
answer += A[i]*B[i];
}
System.out.println(answer);
}
static class FastReader // 빠른 입력을 위한 클래스
}
a = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
print(sum([x*y for x,y in zip(sorted(A), sorted(B, reverse=True))]))