최솟값 만들기(level2)

원용현·2022년 9월 11일
0

프로그래머스

목록 보기
13/49

링크

https://school.programmers.co.kr/learn/courses/30/lessons/12941

문제

길이가 같은 배열 A, B가 주어질 때 각 배열에서 순서에 상관없이 각각 하나를 뽑아 곱한 결과들의 합이 가장 작은 경우를 구하라.

예제로 이해

A = [1, 4, 2]
B = [5, 4, 4]

주어진 배열이 위와 같을 때 최소값이 되는 경우는 다음과 같다.

A -> 첫 번째, B-> 첫 번째 => 5
A -> 두 번째, B-> 두 번째 => 16
A -> 세 번째, B-> 세 번째 => 8

총합 => 29

위의 경우에는 각 요소들을 순서대로 뽑은 뒤에 곱한 값 들의 합이 구하려는 최솟값과 일치하였지만, 일반적인 경우에는 위의 경우를 만족하지 않는다.

이 문제를 해결하기 위해서는 최솟값을 만들기 위해서 어떻게 해야할지를 먼저 생각 해야한다.

구하려는 최솟값은 곱하기로 구한 값들의 합으로 구성이 되기 때문에 곱한 값들이 최소가 되도록 해야한다.

곱한 값들을 최소로 유지하기 위한 방법은 바로 A 배열에서 최솟값, B 배열에서 최댓값을 곱하면 된다. 각 배열의 최솟값과 최솟값을 곱하는 경우 당연히 최솟값이 나오겠지만, 최댓값과 최댓값을 곱하는 경우에는 곱하기의 경우 각 요소의 숫자가 커질수록 결과값은 더욱더 커지기 때문에 최댓값에 대해서 가장 작은 결과를 기대할 수 있는 최솟값을 곱함으로써, 가장 작은 숫자가 나오도록 해준다.

따라서 이 문제는 두 배열을 모두 정렬을 먼저 진행을 하는데, 한 배열은 오름차순으로 정렬을 하고 나머지 배열은 내림차순으로 정렬을 진행한다. 정렬이 완료되면 각 배열에서 같은 index에 위치한 요소들을 곱하고 더한 결과를 반환하도록한다.

코드

function solution(A,B){
    let result = 0
    
    let a = A.sort((a, b) => a - b)
    let b = B.sort((a, b) => b - a)
    
    a.map((el, index) => {
        result += el * b[index]
    })
    
    return result
}

코드 풀이

가장 먼저 정렬을 진행한다. 하나의 배열은 오름차순, 나머지 배열은 내림차순으로 정렬을 진행한다.

정렬이 완료되면 반복문을 진행한다. 반복문은 배열의 길이만큼 진행하며(위에서는 map으로 반복문을 돌림.) 두 배열에서 같은 index에 위치한 요소들을 곱한 뒤에 그 곱한 값들의 합을 반환한다.

0개의 댓글