길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)
예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면
A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)
즉, 이 경우가 최소가 되므로 29를 return 합니다.
배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.
배열 A, B의 크기 : 1,000 이하의 자연수
배열 A, B의 원소의 크기 : 1,000 이하의 자연수

문제의 예시와 같습니다.
A에서 첫번째 숫자인 1, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두번째 숫자인 2, B에서 첫번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10)
이 경우가 최소이므로 10을 return 합니다.
# A에서는 min값을 계속 뽑고 B에서는 max값을 계속 뽑아서 계산 한다.
# A랑 B의 배열 길이는 같다.
def solution(A,B):
A.sort()
B.sort(reverse=True) # 내림차순
answer = 0
for a in range(len(A)): # A의 배열 길이만큼 같으니까
answer += A[a] * B[a]
return answer
일단 문제의 조건에서 구할 수 있는건 배열 A와 배열 B의 길이가 같다는 것이다.
이를 활용해서 반복문의 길이를 배열 A or B 둘 중 하나를 선택하면 된다는 것을 알 수 있다.
그리고 그 다음으로 최소값을 구하는게 목적인데 이를 이루기 위해서는 (A의 최소값 B의 최대값) 이런식으로 계산을 진행하면 된다. (혹은 (A의 최대값 B의 최소값) 이렇게 계산을 하면 된다.)
먼저 최소값을 구하려면 sort() 함수를 활용해서 배열을 오름차순으로 구성한다.
(오름차순으로 배열을 구성하게 되면 예시에서 1,4,2 → 1,2,4 가 되므로 계산을 하는게 쉬워진다.)
다음으로 최대값을 구하려면 sort(reverse=True)를 활용해서 내림차순으로 구성한다.
(이 때 True를 Ture로 오기입 하지 않도록 주의!)
각 상태별 정렬을 마치고 나면 이제 남은건 배열 A의 길이만큼 (혹은 배열 B의 길이만큼) 반복문을 돌려준다.
A와 B의 곱을 이제 A[a]를 하게 되면
예시 : A → 1, 3, 5, 6, 8, 9, 9일 때 A[a]를 돌리면
A[0] = 1, A[1] = 3, A[2] = 5, A[3] = 6, A[4] = 8, A[5] = 9, A[6] = 9 이러한 순서로 진행된다.
이러한 순서로 진행되는 최소값 * 최대값의 결과를 총합으로 만들면 결과가 답이 나오게 된다.