정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.
입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다.
배열의 요소는 음수와 0을 포함하는 정수입니다.
배열의 길이는 3 이상입니다.
//내 코드
const largestProductOfThree = function (arr) {
// TODO: 여기에 코드를 작성합니다.
if(arr.includes(0)) return 0;
let sorted = arr.filter(v => v!==0).sort((a,b) => b-a);
if(sorted[0]>0 && sorted[1]>0 && sorted[2]>0){
let a = sorted[0] * sorted[1] * sorted[2];
let b = sorted[0] * sorted[sorted.length-1] * sorted[sorted.length-2];
return a>b ? a:b;
}
if(sorted[0]<0 && sorted[1]<0 && sorted[2]<0) return sorted[0] * sorted[1] * sorted[2];
if(arr[1]<0 || arr[2]<0) return sorted[0] * sorted[sorted.length-1] * sorted[sorted.length-2];
};
//0은 필터링
//sort b-a 정렬
//arr[0],arr[1],arr[2]가 양수라면
//0,1,2와 0,sorted.length-1, sorted.length-2 중 곱해서 큰 것을 반환
//정렬 앞쪽 3개요소가 모두 양수가 아니라면,
//arr[1] 또는 /arr[2]가 음수인경우 -> arr[0] * arr[arr.length-1] * arr[arr.length-2]
//레퍼런스 코드
const largestProductOfThree = function (arr) {
const sorted = arr.slice().sort((a, b) => a - b);
const len = arr.length;
const candi1 = sorted[len - 1] * sorted[len - 2] * sorted[len - 3];
const candi2 = sorted[len - 1] * sorted[0] * sorted[1];
return Math.max(candi1, candi2);
};
//정리 : 전부양수인 정렬의 3번째요소까지 곱한것과, 양수첫번째와 음수첫번째,2번째를 곱한 것 중 큰것을 반환
//나는 더 여러 개의 경우의 수를 나눠서 코드를 적었다면, 레퍼런스 코드는 경우의 수를 더 정확하게 짧게 나눴다. 마지막까지 좀 더 생각해서 더 짧고 간단하게 코드를 쳐야 겠다.
다소 복잡해질 수도 있는 코드인데 깔끔하게 잘 만드신거 같네요!!