public class Solution {
public static int largestProductOfThree(int[] arr) {
int max1=0;
int max2= 0;
int len = arr.length;
Arrays.sort(arr);
max1 = arr[len-1] * arr[len-2] * arr[len-3];
max2 = arr[len-1] * arr[0] * arr[1];
return Math.max(max1,max2);
}
public static void main(String[] args) {
int output = largestProductOfThree(new int[]{2, 1, 3, 7});
System.out.println(output); // --> 42 (= 2 * 3 * 7)
output = largestProductOfThree(new int[]{-1, 2, -5, 7});
System.out.println(output); // --> 35 (= -1 * -5 * 7)
}
}
배열은 음수, 0, 양수가 섞여서 존재할 수 있다.
따라서 경우의 수는,
로 나눌 수 있다.
우선 오름차순으로 배열을 정렬한 후, max 값을 구한다.
1) 가장 큰 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]
2) 가장 작은 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]
3-1) 모두 양수인 가장 큰 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]
3-2) 양수 중 가장 큰 값과 음수 중 가장 작은 값 2개를 곱한다.
-> arr[len-1] * arr[0] * arr[1]
(3)의 경우에는, 두 경우 중 더 큰 값이 max 값이 된다.
(1), (2), (3)의 경우를 일반화해서 작성하면, 다음과 같다.
max1 = arr[len-1] * arr[len-2] * arr[len-3];
max2 = arr[len-1] * arr[0] * arr[1];
return Math.max(max1,max2);