- A[i] * B[i] 값들의 합이 최소가 되기 위해서는 A의 가장 작은 값과 B의 가장 큰 값이 곱해져야 한다.(그 반대도 가능 A의 가장 큰 값과 B의 가장 작은 값)
- 리스트 안에는 중복된 값이 있으므로 중복값을 주의해서 계산해야 한다.(계산한 값은 삭제하거나 아예 나올 수 없는 값으로 초기화 시켜줌으로써 배제하기)
- 메모리 : 30864 KB
- 시간 : 72 ms
n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
answer = 0
for i in range(n):
a = min(A)
b = max(B)
answer += a*b
del A[A.index(a)]
del B[B.index(b)]
print(answer)
- 배열 B는 재정렬을 하면 안된다고 문제에 조건으로 나와있었기 때문에 B의 값들을 b에 옮긴 뒤 b를 정렬해 정렬한 위치의 값인 인덱스를 사용해 풀려고 시도했다. -> 코드가 복잡해짐
- 문제에는 재정렬하지 말란 조건이 있지만 문제를 푸는데 있어 보다 쉽고 간편하게 푸는 방법으론 A와 B를 각각 내림차순과 오름차순(또는 오름차순과 내림차순)으로 정렬한 뒤 곱해 더하는 것이 더 편하다.
- 로직이 복잡해짐에 따라 오류가 발생하고 그 오류를 발생하기가 어려운 것 같다. 이 코드도 로직이 복잡해짐에 따라 오류가 발생했고 그래서 틀렸습니다. 란 결과가 나왔다.
- 정렬해서 푸는 것이 싫다면 위의 코드와 같이 최대값과 최소값을 이용해 푸는 것도 괜찮다.
n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
b = [i for i in B]
b.sort()
A.sort(reverse = True)
result_a = []
result_b = []
for value in B:
for index in range(n):
if value == b[index]:
result_b.append([value,index])
b[index] = -1
for index in range(n):
result_a.append(A[result_b[index][1]])
answer = 0
A = result_a
for i in range(n):
answer += A[i]*B[i]
print(answer)