문제
정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴하라.
배열은 0,음수,양수를 포함한 최소 3개 이상의 요소를 갖는다.
const largestProductOfThree = function (arr) {
const sorted = arr.slice().sort((a,b) => a-b);
const len = arr.length;
const candi1 = arr[len-1] * arr[len-2] * arr[len-3];
const candi2 = arr[len-1] * arr[0] * arr[1];
return Math.max(candi1,candi2);
};
오름차순으로 정렬하면, 요소들의 곱을 구할때, 모두 양수인 경우, 모두 음수인 경우, 음수와 양수가 모두 포함된 경우 등 다양한 경우의 수를 논리적으로 분리할 수 있게 된다.
const candi1 = arr[len-1] * arr[len-2] * arr[len-3];
const candi2 = arr[len-1] * arr[0] * arr[1];
candi1
이 최대값인 경우는 언제일까?arr[0] < 0
arr[1] < 0 && Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) < arr[len-2]
arr[1] === 0
arr[1] < 0 && arr[len-2] !==0 && arr[len-3] !== 0
candi2
가 최대값인 경우//arr[0] < 0 && arr[1] < 0
//Math.abs(arr[0]) >= arr[len-1]
const arr = [-5, -2, 1, 2, 5]이라면,
candi1 = 1 * 2 * 5; //10
candi2 = (-5) * (-2) * 5; //50
Math.max(candi1, candi2) = candi2
//Math.abs(arr[0]) >= arr[len-1]
const arr = [-5, -1, 1, 2, 5]이라면,
candi1 = 1 * 2 * 5; //10
candi2 = (-5) * (-1) * 5; //25
Math.max(candi1, candi2) = candi2
//Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) < arr[len-2]
const arr = [-5, -1, 1, 2, 10]이라면,
candi1 = 1 * 2* 10; //20
candi2 = (-5) * (-1) * 10 //50
Math.max(candi1, candi2) = candi2
//Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) >= arr[len-1]
const arr = [-9, -8, 3, 8, 10]이라면,
candi1 = (-9) * (-8) * 10; //720
candi2 = 3 * 8 * 10 //240
Math.max(candi1, candi2) = candi1
//arr[0] < 0 && arr[1] === 0
//Math.abs(arr[0]) >= arr[len-1]
const arr = [-5, 0, 1, 2, 5]이라면,
candi1 = 1 * 2 * 5; //10
candi2 = (-5) * 0 * 5; //0
Math.max(candi1, candi2) = candi1
//arr[0] < 0 && arr[1] > 0
//Math.abs(arr[0] >= arr)
const arr = [-5, 2, 3, 4, 5]이라면,
candi1 = 3 * 4 * 5; //60
candi2 = (-5) * 2 * 3; //-30
Math.max(candi1, candi2) = candi1