본문 바로가기
알고리즘연습/백준

[BOJ] 1026번 보물 자바 - 정렬

by 밈밈무 2022. 6. 20.

문제

옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.

길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.

S = A[0] × B[0] + ... + A[N-1] × B[N-1]

S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.

S의 최솟값을 출력하는 프로그램을 작성하시오.

풀이

B는 재배열하면 안된다 했지만 재배열을 한다. A는 오름차순으로 정렬하고 B는 내림차순으로 정렬하면 두 곱의 합이 최소가 된다.
내림차순으로 정렬할 때는
Arrays.sort(B, Collections.reverseOrder());를 사용한다.
이 때 B가 객체(Integer) 배열이어야 한다.

코드

package BOJ.sorting;

import java.util.*;
import java.io.*;
public class No1026_보물 {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        int[] A=new int[N];
        StringTokenizer st=new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            A[i]=Integer.parseInt(st.nextToken());
        }

        Arrays.sort(A);

        Integer[] B=new Integer[N];
        st=new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            B[i]=Integer.parseInt(st.nextToken());
        }

        Arrays.sort(B, Collections.reverseOrder());

        int S=0;
        for(int i=0;i<N;i++){
            S+=(A[i]*B[i]);
        }

        System.out.println(S);
    }
}