옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.
S = A[0] × B[0] + ... + A[N-1] × B[N-1]
S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.
S의 최솟값을 출력하는 프로그램을 작성하시오.
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.
첫째 줄에 S의 최솟값을 출력한다.
5
1 1 1 6 0
2 7 8 3 1
18
핵심 : 배열의 A의 가장 큰 값 * 배열 B의 가장 작은 값을 곱해서 더해 나가면 가장 작은 합계값을 만들 수 있음.
1. sorted 함수를 이용해서 A와 B를 오름차순, 내림차순으로 정렬한 새로운 배열을 만든다.
2. for문으로 A와 B의 각 배열 값을 더하기
# BOJ Greedy 1026
# 보물
# S를 가장 작게 만들기 위해 A 순서 변경 가능. 단 B변경 안됨
# 핵심 : A의 가장 큰값 x B의 가장 작은 값
N = int(input()) # 배열들의 길이
A = list(map(int, input().split())) # A 배열 세팅 - 순서 변경 가능
B = list(map(int, input().split())) # B 배열 세팅
S = 0 # 합계
sorted_A = sorted(A, reverse=True) # A를 재정렬
sorted_B = sorted(B) # B를 재정렬
for i in range(N) : # 값 더하기
S += sorted_A[i] * sorted_B[i]
print(S)