본문 바로가기
프로그래머스 코딩테스트 문제/Level 2

[프로그래머스] - 최솟값 만들기(C++)

by jyppro 2024. 11. 21.

최솟값 만들기

오늘은 최솟값 만들기 입니다. 원래 이 문제가 정답률이 78% 였는데, 다시 확인해보니 79%가 되었네요. 그럼 시작하겠습니다. 

 

문제 설명

길이가 같은 배열 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의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수

 

입출력 예

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 합니다.

 

시작 코드

#include <iostream>
#include<vector>
using namespace std;

int solution(vector<int> A, vector<int> B)
{
    int answer = 0;

    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    cout << "Hello Cpp" << endl;

    return answer;
}

 

 

나의 풀이

#include <vector>
#include <algorithm>
 
using namespace std;
 
bool compare(int a, int b)
{
    return a > b;
}
 
int solution(vector<int> A, vector<int> B)
{
    int answer = 0;
 
    // 오름차순 정렬
    sort(A.begin(), A.end());
    // 내림차순 정렬
    sort(B.begin(), B.end(), compare);
    
    // 각 원소를 순서대로 곱하여 answer에 더함
    for(int i = 0; i < A.size(); i++) answer += A[i] * B[i];
    
    return answer;
}

 

코드 분석

sort함수를 사용하여 A의 처음부터 끝까지 정렬하고, 한번 더 sort로 B를 정렬합니다. 이때 위에 만들어둔 compare 함수를 사용하여 내림차순으로 정렬되도록 만들어 줍니다. 이후 반복문으로 A의 사이즈만큼 돌려서 answer에 각 인덱스의 A * B 값을 추가해줍니다.

 

풀이 설명

먼저 문제를 보면, 예시로 어떻게 하는 건지 대충 알려줬기 때문에 딱히 말할 내용은 없습니다. 이 문제의 핵심은 양쪽 배열의 요소들을 순서대로 곱했을 때, 가장 작은 수가 되도록 만드는 것입니다. 곱셈이 작은 수로 만들어질려면 가장 큰수와 가장 작은 수를 곱하는 것이 가장 좋은 방법입니다. 그래서 정렬을 사용해 A를 오름차순으로, B는 비교함수를 만들어 사용하여 내림차순 정렬로 만들어 곱해주는 방식을 사용한 것입니다.

 

<NEXT>

오늘은 최솟값 만들기를 풀어보았습니다. 앞으로도 이런식으로 쭉 해보도록 하겠습니다. 감사합니다.