개발/알고리즘(코딩테스트)
프로그래머스, 자바스크립트) 최솟값 만들기
빔네모
2024. 11. 15. 23:57
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12941
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
일차적인 풀이는 우선 최소의 합을 만들기 위해 큰 수, 작은 수로 정렬하여 곱해준걸 합산한다.
function solution(A,B){
let answer = 0;
//곱한게 최소가 되려면, 큰 수 * 작은 수
const BigA = Math.max(...A)
const BigB = Math.max(...B)
if(BigA > BigB) {
const sortA = A.sort((a,b) => b-a)
const sortB = B.sort((a,b) => a-b)
sortA.forEach((x,i) =>{
answer+= x * sortB[i]
})
} else {
const sortA = A.sort((a,b) => a-b)
const sortB = B.sort((a,b) => b-a)
sortA.forEach((x,i) =>{
answer+= x * sortB[i]
})
}
return answer;
}
A의 최댓값이 크나 B의 최댓값이 크나 상관없이 하나는 오름차순, 다른 하나는 내림차순으로 해주면 되기에
조건문을 제거하고 정렬 후 반복문만 남겼다.
function solution(A, B) {
let answer = 0;
// A는 오름차순, B는 내림차순으로 정렬
A.sort((a, b) => a - b);
B.sort((a, b) => b - a);
// 정렬 후, 각 요소의 곱을 누적
for (let i = 0; i < A.length; i++) {
answer += A[i] * B[i];
}
return answer;
}
반복문도 결국 합산을 위해 사용하는 것이니 reduce로 누적하는걸로 수정
function solution(A, B) {
const sortA = A.sort((a,b) => a-b);
const sortB = B.sort((a,b) => b-a);
return sortA.reduce((sum, curr, i) => sum + curr * sortB[i], 0);
}