옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.
S = A[0] × B[0] + ... + A[N-1] × B[N-1]
S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.
S의 최솟값을 출력하는 프로그램을 작성하시오.
입력 | 출력 |
---|---|
5 1 1 1 6 0 2 7 8 3 1 | 18 |
3 1 1 3 10 30 20 | 80 |
9 5 15 100 31 39 0 0 3 26 11 12 13 2 3 4 5 9 1 | 528 |
배열 A, B의 길이는 N으로 동일
하며, 0 < N <= 50
이다.
배열의 원소는 0 <= 원소 <= 100
이다.
이 문제에는 배열 A를 재배열하여 S의 최솟값을 구하라고 나와 있다. 하지만 실제 출력값에 필요한 것은 S의 최솟값이다.
S의 최솟값을 구하려면 배열 A, B의 각 원소들을 곱하여 더했을 때 최솟값이 나오면 된다.
위와 같이 정렬하여 각 원소를 곱하여 더한 값을 출력하면 간단하게 풀린다.
이 문제에 필요한 자료구조는 ArrayList다.
이 문제의 시간 복잡도는 각 배열의 정렬에 O(NloN)
, 각 원소를 곱하고 더하는데 O(N)
이 된다. 즉, O(NlogN)의 시간 복잡도를 가지게 된다. 각 배열의 최대 크기는 100이므로 이 문제를 풀이할 수 있다.