n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
a.sort()
a_resort = [0] * n
b_index = []
for i in range(n):
b_index.append((i,b[i]))
b_index.sort(key=lambda x:-x[1])
for i in range(n):
a_resort[b_index[i][0]] = a[i]
sum = 0
for i in range(n):
sum += (a_resort[i] * b[i])
print(sum)
이번 문제는 전형적인 Greedy 알고리즘 문제로 난이도는 크게 어렵지 않았다.
이 문제의 핵심은 배열 A의 원소와 B의 원소간의 곱이 최소가 되도록 하는 것인데, 여기서 우리는 어떤 두 수의 곱이 최소가 되도록 하려면 매 곱마다 '가장 큰 수 * 가장 작은 수'가 되도록 계산을 해야한다는 것이다.
따라서 배열 B는 재배열할 수 없기 때문에, 배열 B에서 원소의 값이 가장 큰 순서대로 배열 A의 값이 가장 작은 원소와 곱해주었다.
그리디 알고리즘의 핵심인 매 순간마다 가장 좋은 것만 선택하며 푼다는 점을 리마인드 시킬 수 있었던 문제였다 😎
'Algorithm 💡 > Greedy' 카테고리의 다른 글
[백준 5585번] 거스름돈 (0) | 2023.02.08 |
---|---|
[백준 1541번] 잃어버린 괄호 (0) | 2023.02.08 |
[백준 1931번] 회의실 배정 (0) | 2023.02.07 |
[백준 11047번] 동전 0 (0) | 2023.02.07 |
[백준 11399번] ATM (0) | 2023.02.06 |