1 minute read



문제 풀이


이 문제는 배열 정렬을 통해 풀 수 있는 간단한 문제이다.


아이디어 도출

A 배열과 B 배열을 어떻게 정렬해야 A[0]*B[0]+...+A[N]*B[N]의 값을 최소로 할 수 있을까?

조금만 생각해보면 쉽게 알 수 있다. 바로 곱해지는 수를 작게 만들면 된다. 아래 예시를 보자.

1
2
3
4
5
6
7
8
9
10
5
1 1 1 6 0 
2 7 8 3 1
= 2+7+8+18+1 = 35

// A 배열은 내림차순으로, B 배열은 오름차순으로 정렬
5
6 1 1 1 0
1 2 3 7 8
= 6+2+3+7+0 = 18 

위처럼 곱해지는 수가 작게 되도록 A 배열은 내림차순으로, B 배열은 오름차순으로 정렬하여 S 함수식을 적용하니 최솟값을 구할 수 있었다.


문제 풀이를 위해 작성한 코드는 아래와 같다.

작성코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.util.*;

class Main {    

    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int N = Integer.parseInt(br.readLine());
        Integer[] A = new Integer[N];
        int[] B = new int[N];

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

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

        /**
         * A, B 배열 정렬
         * (A[0]*B[0])+(A[N]*B[N]) 값을 최소로 만드러면 B 원소의 최대값일 수록 작은 값을 곱해야 한다.
         * 이를 위해 B를 오름차순으로 정렬한 뒤, A를 내림차순으로 정렬한다.
         * 이때, A를 내림차순 정렬하기 위해 Integer형의 배열로 사용한다.
         */
        Arrays.sort(A, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        Arrays.sort(B);

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

        bw.write(result+"\n");

        bw.close();
        br.close();
    }

}

출처


  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.