개발/알고리즘(코딩테스트)

프로그래머스, 자바스크립트) 최솟값 만들기

빔네모 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);
}