옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 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의 최솟값을 출력한다.
// let input = require('fs').readFileSync('/dev/stdin').toString().split('\n');
let input = [`5`,
`1 1 1 6 0`,
`2 7 8 3 1`,]
let N = parseInt(input[0]);
let arrA = input[1].split(' ').map(n=> parseInt(n));
let arrB = input[2].split(' ').map(n=> parseInt(n));
let sortA = input[1].split(' ').map(n=> parseInt(n)).sort((a,b)=>b-a);
let sortB = input[2].split(' ').map(n=> parseInt(n)).sort((a,b)=>a-b);
// console.log(arrA, arrB, sortA, sortB);
let sum = 0;
for(let i=0; i<N; i++){
sum += sortA[i]*sortB[i]
}
console.log(sum);
배열A는 내림차순으로sort, 배열B는 오름차순으로sort하여 곱한값을 sum에 더했다
배열B는 재배열하면 안된다고 했지만 구하는 값이 어차피 합이라서 sort하여 구하였다
만약에 재배열한 A를 출력해야 한다면
for 안에서 sortB를 이용하여 index값을 구해서
let index = arrB.indexOf(sortB[i])
각 index번호에 arrA를 큰 순서대로 재배열하면 될 것 같다