[TIL] 2023.09.03 Programmers_최솟값 만들기

최솟값 만들기

Programmers.jpg

문제 설명

길이가 같은 배열 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 함수를 완성해 주세요.

 

 

입출력 예

A B answer
[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10

입출력 예 #1
문제의 예시와 같습니다.

 

입출력 예 #2
A에서 첫번째 숫자인 1, B에서 두 번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두 번째 숫자인 2, B에서 첫 번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10)
이 경우가 최소이므로 10을 return 합니다.

 

 

나의 풀이

function solution(A,B){
    const sortedA = A.sort((a, b) => a - b);
    const sortedB = B.sort((a, b) => b - a);
    return A.reduce((sum, _, i) => sum + (sortedA[i] * sortedB[i]), 0);
}
  1. 입출력 예를 분석하며 패턴을 찾아냈다. A의 최솟값과 B의 최댓값을 차례대로 곱하면 된다는 것.
  2. 처음에는 for문과 Math.max()Math.min()을 사용하는 방법을 생각했지만 이 경우 이미 계산에 사용한 k번째 숫자를 제외하기 어렵다는 문제가 있었다.
  3. 결국 sort()를 사용해서 배열 전체를 sort하기로 했다.
  4. A는 오름차순으로 sort하고 B는 내림차순으로 sort 한다.
  5. 최종적으로 reduce()를 사용해서 같은 index를 가진 A와 B의 요소를 곱한 값을 누적해서 더해준다.

 

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months); // ["Dec", "Feb", "Jan", "March"]

그런데 다른 사람의 풀이를 보고 sort()는 원 배열 자체를 정렬하는 메서드이기 때문에 불필요하게 변수에 할당해 줄 필요가 없다는 점이 기억났다.

 

const months = ["Mar", "Jan", "Feb", "Dec"];
const sortedMonths = months.toSorted();

console.log(sortedMonths); // ['Dec', 'Feb', 'Jan', 'Mar']
console.log(months); // ['Mar', 'Jan', 'Feb', 'Dec']

만약 원본 배열은 유지한 채 sort된 새로운 배열을 반환하고 싶다면 최근 JavaScript에 추가된 메서드 toSorted()를 사용하면 된다.

 

ES2023에서 도입된 자바스크립트의 새로운 배열 복사 메서드를 더 자세하게 알고 싶다면👇🏻

 

[번역] ES2023에서 도입된 자바스크립트의 새로운 배열 복사 메서드

최근 확정된 ES2023에서는 기존 배열이 아닌 복사본을 변경하여 연산을 수행하는 `toSorted`, `toReversed`, `toSpliced` 와 같은 새로운 메서드들이 추가되었습니다. 이들의 차이점과 프로젝트에서 어떻게

velog.io

 

function solution(A,B){
    A.sort((a, b) => a - b);
    B.sort((a, b) => b - a);
    return A.reduce((sum, _, i) => sum + (A[i] * B[i]), 0);
}

sort()의 특성을 살려서 나의 풀이를 더 간결하게 수정해 봤다.