1026번 : 보물
옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.
S = A[0] × B[0] + ... + A[N-1] × B[N-1]
S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.
S의 최솟값을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.
출력
첫째 줄에 S의 최솟값을 출력한다.
생각해 볼 점
문제에서는 B 배열을 재정렬 하지 말라고 써있었지만, 가장 쉽게 푸는 방법은
A 배열은 오름차순, B 배열은 내림차순으로 정렬하여 서로 곱해주는 방법입니다.
A : {1, 2, 3}
B : {4, 2, 1}
* : 4+4+3 = 11
다음과 같이 풀어서 제출하면 정답입니다.
만약, 문제의 조건대로 B를 그대로 두고 풀고 싶을 경우,
B의 index를 함께 정렬한 후, B의 index 번호에 맞추어 A의 배열을 재설정 하면 될 것입니다.
A : {2, 3, 1}
B : {1, 4, 2}
-> pair<int, int> B_clone[] = {<0,1>, <1, 4>, <2, 2>}
- 정렬
A : {1, 2, 3}
B_clone: {<1, 4>, <2, 2>, <0, 1>}
- 재배치
A : {3, 1, 2}
B : {1, 4, 2}
코드
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N;
scanf("%d", &N);
int *A = new int[N];
int *B = new int[N];
for(int i = 0; i < N; i++) scanf("%d", &A[i]);
for(int i = 0; i < N; i++) scanf("%d", &B[i]);
sort(A, A + N);
sort(B, B + N, greater<int>());
int result = 0;
for(int i = 0; i < N; i++) result += A[i] * B[i];
printf("%d", result);
delete[] A;
delete[] B;
return 0;
}
그 외
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++]백준 - 20040번 문제 (0) | 2021.10.24 |
---|---|
[C++]백준 - 1100번 문제 (0) | 2021.10.24 |
[C++]백준 - 11779번 문제 (0) | 2021.10.23 |
[C++]백준 - 18111번 문제 (0) | 2021.10.22 |
[C++]백준 - 17387번 문제 (0) | 2021.10.22 |