본문 바로가기
TIL/Programmers

[TIL] 2023.09.03 Programmers_최솟값 만들기

by heereal 2023. 9. 3.

최솟값 만들기

문제 설명

길이가 같은 배열 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()`의 특성을 살려서 나의 풀이를 더 간결하게 수정해 봤다.

 

 

 

댓글