본문 바로가기
알고리즘!/Greedy

[C] 1026: 보물

by soeayun 2023. 8. 25.

 결국 함수 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