알고리즘/코딩 테스트

[코딩 테스트] 누적합 - 프로그래머스 최솟값 만들기

Judith Hopps 2023. 1. 27. 15:03
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

최솟값 만들기

문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

 

 

더보기
잘못된 풀이 
1. A는 오름차순, B는 내림차순 정렬하여 하나씩 곱함

틀린 이유!!
arr.sort는 arr.sort((a,b) => a-b) 이렇개 해야함!!

 

function solution(A,B){
    //1. A는 오름차순, B는 내림차순 정렬하여 하나씩 곱함
    let psum = [0]; A.sort; B.sort().reverse();
    for (let i=0;i <A.length;i++) {
        
        psum[i+1] = psum[i] + B[i]*A[i];
    }
    

    

    return psum.at(-1);
}

 

function solution(A,B){
    //2. sort 메서드 이용
    let answer = 0;
    A.sort((a,b) => a-b);;
    B.sort((a,b) => b-a);
    A.forEach((_,i )=> answer += A[i]*B[i])
    return answer
}

 

 

또는 reduce 메서드를 이용하여 변수 선언없이 문제를 풀 수 있다.

function solution(A,B){
    A.sort((a,b) => a-b);
    B.sort((a,b) => b-a);
    
    return A.reduce((pre,cur,i)=>{return pre + cur*B[i]},0)
}
반응형