https://school.programmers.co.kr/learn/courses/30/lessons/12941
문제 설명
같은 길이의 배열 A, B의 두 가지가 있습니다.
각 배열은 자연수로 구성됩니다.
배열 A, B에서 각각 하나의 숫자를 빼고 두 개의 숫자를 곱합니다.
이 프로세스를 배열의 길이만큼 반복하고 두 개의 숫자를 곱한 값을 누적하여 더합니다.
이때 최종적으로 누적된 값을 최소화하는 것이 목표입니다.
(단, 각 배열에서 k번째 숫자를 선택한 경우에는 k번째 숫자를 다시 당길 수 없습니다.
)
예를 들어 A = (1, 4, 2) B = (5, 4, 4) 라면
- A에서 첫 번째 숫자인 1, B에서 첫 번째 숫자인 5를 뺀 다음 곱하고 가산합니다.
(누적값: 0+5(1×5)=5) - A에서 2번째 숫자인 4, B에서 3번째 숫자인 4를 빼서 곱하고 가산합니다.
(누적값: 5+16(4×4)=21) - A에서 3번째 숫자인 2, B에서 2번째 숫자인 4를 빼서 곱하고 가산합니다.
(누적값: 21+8(2×4)=29)
즉, 이 경우는 최소화되기 때문에 29를 반환합니다.
배열 A, B 가 주어졌을 때에 최종적으로 누적된 최저치를 return 하는 solution 함수를 완성해 주세요.
제한사항
- 배열 A, B 크기: 1,000 이하의 자연수
- 배열 A, B의 원소 크기: 1,000 이하의 자연수
입출력 예
A | B | answer |
(1, 4, 2) | (5, 4, 4) | 29 |
(1,2) | (3,4) | 10 |
문제 해결 계획
1. 배열을 각각 오름차순, 내림차순으로 정렬
2. 배열의 길이만큼 각 배열의 값을 곱하여 answer에 추가
1차 시도
import java.util.*;
class Solution {
public int solution(int ()A, int ()B) {
int answer = 0;
Arrays.sort(A);
Integer() C = Arrays.stream(B).boxed().toArray(Integer()::new);
Arrays.sort(C, Collections.reverseOrder());
for ( int i = 0; i < A.length; i++) {
answer += A(i)*C(i);
}
return answer;
}
}
Arrays 함수에 내림차순 정렬이 없으므로 어쨌든 내림차순 정렬을 수행했는데 효율 테스트에서 시간 초과가 발생했습니다.
2차 시도
import java.util.Arrays;
class Solution {
public int solution(int ()A, int ()B) {
int answer = 0;
Arrays.sort(A);
Arrays.sort(B);
for ( int i = 0; i < A.length; i++) {
answer += A(i) * B( B.length - i - 1);
}
return answer;
}
}
배열 2개 모두 오름차순으로 나란히 배열 1개는 공식적으로 내림차순으로 했다
결과는 통과