기타/알고리즘

(JS) 배열 정렬과 연산 - sort, reduce [Programmers - 최솟값 만들기]

가나닩 2024. 9. 29. 16:30
더보기
더보기

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

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)
즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

문제를 풀기위해 아래와 같은 요소들을 고려하였다.

  1. 배열을 큰수에서 작은수, 작은수에서 큰수로 정렬해야한다.
  2. 두 배열을 곱하기 위해 반복문을 쓰거나 reduce를 사용해야한다.
더보기
더보기
function solution(A,B){
    const Aarr = A.sort((a,b) => b-a);
    const Barr = B.sort((a,b) => a-b);
    
    var answer = 0;
    
    for(let i = 0;i < A.length;i++) {
        answer += Aarr[i] * Barr[i];
    }
    
    return answer;
}

 

배열값을 곱하고 합하는 연산은 반복문대신 reduce도 사용이 가능

 

• sort

  • 구조 : arr.sort([compareFunction]);

배열을 정렬할 수 있다. 특정 조건을 기준으로 정렬하려면 compareFunction내부를 원하는 조건으로 채우면 된다. 비어있을 경우 배열 내의 요소들을 문자열로 변환하여 유니코드 값 순서대로 정렬한다.

 

ex) arr.sort((a,b) => b-a)

- 과정을 단순화해서 보면 배열에서 임의의 a(앞요소)와 b(뒷요소)요소를 가지고 특정 연산 수행 후 양수일경우 자리를 바꾸지 않고 음수일경우 자리를 바꾸는 식으로 비교를 진행한다. a보다 b가 클 경우 양수이므로 뒷요소가 클때 자리를 바꾸지 않는다. 다시말해 더욱 큰 요소가 뒤로 가도록 정렬되어 내림차순 정렬이 수행된다.

 

 

• reduce

구조 : 

arr.reduce((accumulator, currentValue, currentIndex, array) => {
    // 연산할 내용
}, initialValue);

 

배열의 각 요소를 순차적으로 연산하여 최종적으로 하나의 값으로 반환해주는 함수이다.

  • accumulator : 이전 함수 호출에서 반환된 값(연산이 누적된 값)
  • currentValue : 현재 배열 요소
  • currentIndex(선택) : 현재 배열 인덱스
  • array : 현재 배열
  • initialValue : accumulator의 초기값, 지정하지 않으면 배열의 첫번째 요소가 초기값으로 설정됨.

ex) Aarr.reduce((acc, value, index) => acc + value * Barr[index], 0)

Aarr 이라는 배열에 대해 연산을 진행한다. acc라는 누적값에 Aarr 배열의 값과 Barr 배열의 값을 순차적으로 곱하여 모두 더하는 역할을 한다.