[프로그래머스 | Javascript] 최솟값 만들기

박기영·2023년 1월 12일
0

프로그래머스

목록 보기
114/159
post-custom-banner

테스트 케이스 통과 O, 효율성 통과 X

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()로 인해서 어느 한 곳의 원소가 삭제되면, 배열의 경우 시간 복잡도가 증가한다.
하나씩 다 이동시켜줘야하기 때문이다.

solution

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해도 된다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글