결국 함수 S를 최소화하기 위해 배열 A를 재배열 해야한다. 최소화 하기 위해서는 현재 남아있는 A배열에 가장 작은 수와 B배열에 남아있는 가장 큰 수를 곱해줘야지만 S의 값이 최소가 된다. 이 문제에서는 B에 있는 수를 재배열하면 안된다고 했지만 어차피 문제는 답만 맞으면 된다는 생각으로 A는 오름차순으로 B는 내림차순으로 정렬한뒤 같은 index끼리 곱해주었다.
사실 이 문제와 완전 같은 방식으로 하기 위해서는 이차원 배열 두 개를 만든 뒤 현재 남아있는 A배열에 가장 작은 수와 B배열에 남아있는 가장 큰 수를 곱해주고 그 수는 지나갔다는 표시를 남겨주어 다음번에 이 수는 아예 빼고 생각하도록 코드를 짜면 된다.
#include <stdio.h>
int arrA[51];
int arrB[51];
void swap(int *a,int*b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
int main(void)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&arrA[i]);
for(int j=i;j>1;j--)
{
if(arrA[j]<arrA[j-1])
swap(&arrA[j],&arrA[j-1]);
}
}
for(int i=1;i<=n;i++)
{
scanf("%d",&arrB[i]);
for(int j=i;j>1;j--)
{
if(arrB[j]>arrB[j-1])
swap(&arrB[j],&arrB[j-1]);
}
}
int result=0;
for(int i=1;i<=n;i++)
{
result+=arrA[i]*arrB[i];
}
printf("%d",result);
}
'알고리즘! > Greedy' 카테고리의 다른 글
[C/C++] 백준 1931: 회의실 배정 (풀이) (0) | 2023.09.05 |
---|---|
[C/C++] 1541: 잃어버린 괄호 (0) | 2023.08.24 |