※ 본 문제는 백준 온라인 저지 사이트에서 발췌하였습니다.
옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 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의 최솟값을 출력한다.
# baekjoon
# 1026 보물
n = int(input()) # 길이가 n
a = list(map(int, input().split())) # 정수배열 a 선언
b = list(map(int, input().split())) # 정수배열 b 선언
a.sort() # a를 오름차순 sorting
b.sort(reverse=True) # b를 내림차순 sorting
s = 0 # 최솟값 선언
for i in range(0, n): # for문을 돌면서
s += a[i] * b[i] # 최솟값에 a[i] * b[i]를 더한다.
print(s)
사실 문제에서 정수 배열 B는 재배열 하지 말라고 그랬는데, 그냥 sorting했다. 배열을 구하는 것도 아니고 결국 최솟값만 구하면 되는 거라 이렇게 풀 수 있었다. (모로가도 서울만 가자) 문제에서 요구하는대로 B를 재배열하지 않고 푸는 방법은 다음과 같다.
# 1026번
n = int(input())
a_list = list(map(int, input().split()))
b_list = list(map(int, input().split()))
s = 0
for i in range(n):
s += min(a_list) * max(b_list) # A배열의 최솟값과 B배열의 최댓값을 곱해서 s에 더해줌
a_list.pop(a_list.index(min(a_list))) # pop함수를 이용해서 A배열의 최솟값과
b_list.pop(b_list.index(max(b_list))) # 최댓값을 배열에서 빼주면서 계속 반복
print(s)
(출처 : 윤상님의 블로그 https://yoonsang-it.tistory.com/44)