function solution(A,B){
let sum = 0;
while(A.length > 0 && B.length > 0){
const minA = Math.min(...A);
const maxB = Math.max(...B);
const multiple = minA * maxB;
sum += multiple;
const indexOfMinA = A.indexOf(minA);
const indexOfMaxB = B.indexOf(maxB);
A.splice(indexOfMinA, 1);
B.splice(indexOfMaxB, 1);
}
return sum;
}
간단한 원리로 해결하는 방법이다. 소제목에도 적어놨지만 효율성 테스트는 하나도 통과하지 못한다.
다만, 효율성 통과를 위해 작성해야할 코드의 기본적인 흐름을 파악하기 좋았다고 생각한다.
A 배열의 가장 작은 값과 B 배열의 가장 큰 값을 곱해서 더해나가면,
결국 누적합은 가장 작은 값이 된다는 점을 이용했다.
사용된 원소는 바로 splice()
를 통해 삭제한다.
단, splice()
로 인해서 어느 한 곳의 원소가 삭제되면, 배열의 경우 시간 복잡도가 증가한다.
하나씩 다 이동시켜줘야하기 때문이다.
function solution(A,B){
const sortedA = A.sort((a,b) => a - b);
const sortedB = B.sort((a,b) => b - a);
let sum = 0;
sortedA.forEach((a, index) => {
sum += a * sortedB[index];
})
return sum;
}
위에서 사용한 논리를 그대로 가져왔다.
단, 원소를 삭제하는 것을 생략했고, 사전에 정렬을 통해 순차적으로 연산하는 것으로 그 조건을 만족했다.
A
는 오름차순, B
는 내림차순 정렬하여 맨 앞부터 차례대로 곱하고 누적합을 해주면 된다.
function solution(A,B){
A.sort((a, b) => a - b)
B.sort((a, b) => b - a)
return A.reduce((total, val, idx) => total + val * B[idx], 0)
}
필자와 같은 논리가 적용되었지만, reduce()
로 누적합을 구하신 것이 다른 점이다.
참고로, sort()
는 원본 배열을 변환하기 때문에 별도로 변수에 저장하지 않아도 된다.
또한, forEach()
와 다르게 reduce()
는 반환값이 있기 때문에 바로 return
해도 된다.