문제
자연수로 이루어진 길이가 같은 수열 A,B가 있습니다. 최솟값 만들기는 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱한 값을 누적하여 더합니다. 이러한 과정을 수열의 길이만큼 반복하여 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다.
예를 들어 A = [1, 2] , B = [3, 4] 라면,
- A에서 1, B에서 4를 뽑아 곱하여 더합니다.
- A에서 2, B에서 3을 뽑아 곱하여 더합니다.
수열의 길이만큼 반복하여 최솟값 10을 얻을 수 있으며, 이 10이 최솟값이 됩니다.
수열 A,B가 주어질 때, 최솟값을 반환해주는 getMinSum 함수를 완성하세요.
풀이
두 수열에서 각각 값을 뽑아 곱한 후 그것들을 모두 더하여 최소값을 만들어야 한다.
따라서 접근 방법은 한 수열에서 가장 작은 값을 구하고, 다른 수열에서는 가장 큰 수를 뽑도록 하였다.
먼저 가장 작은 값과 큰 값을 쉽게 접근하기 위해 정렬을 하였다. sort는 algorithm 헤더 파일에 정의되어있다.
그리고 나서 A 벡터에서 가장 작은 수를 선택하고(A.at(i))
B 벡터에서 가장 큰수(B의 맨끝 = size() – 1)를 선택하고 이 두 수를 곱하면서 answer를 만든다.
소스 코드
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int getMinSum(vector<int> A, vector<int> B)
{
int answer = 0;
int mulVal;
sort(A.begin(), A.end());
sort(B.begin(), B.end());
for (int i = 0; i < A.size(); i++)
{
mulVal = A.at(i) \* B.at((B.size() - 1) - i);
answer += mulVal;
}
return answer;
}
int main()
{
vector<int> tA{ 1, 2 }, tB{ 3, 4 }; // 아래는 테스트 출력을 위한 코드입니다. cout<<getMinSum(tA,tB); }
}
알고리즘 문제 Level 2 | 프로그래머스
'Algorithm' 카테고리의 다른 글
행렬의 곱셈 (0) | 2018.12.27 |
---|---|
2016년 요일 구하기 (0) | 2018.12.27 |
콜라츠 추측 (0) | 2018.12.27 |
소수 찾기 - 에라토스테네스의 체 (0) | 2018.12.27 |
최소공배수 최대공약수 (0) | 2018.06.22 |