문제 : 정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.
내가 푼 식
const largestProductOfThree = function (arr) {
// TODO: 여기에 코드를 작성합니다.
// 절대값을 구하고 배열을 다시 만든다
let newarr = [];
let tem
let result
for(let i = 0; i < arr.length; i++) {
newarr[i] = Math.abs(arr[i])
}
// 제일 큰거를 순서대로 젤 왼쪽 배열에 놓는다
for(let i = 0; i < newarr.length; i++) {
for(let j = 0; j < newarr.length; j++) {
if(newarr[j] < newarr[j+1]) {
tem = newarr[j]
newarr[j] = newarr[j+1]
newarr[j+1] = tem
console.log(newarr)
}
}
}
for(let i = 0; i < arr.length; i++) {
if(arr[i] < 0) {
newarr[i] = -newarr[i]
console.log(newarr[i])
}
}
// 배열에서 0,1,2 번째 인덱스 값을 곱한다
result = newarr[0] * newarr[1] * newarr[2]
return result
};
나는 양수, 음수 관계없이 절대값을 구한 다음에 제일 큰 수를 맨 앞 부터 채워 넣는 방법을 선택하였다. 이것은 정보처리기사 자격증을 공부할 때 사용한 선택정렬을 생각하며 만든 방법이다. 하지만 이 방법은 잘못되었었다.
테스트 결과중 -값과 -값을 곱해서 최대값을 구하는 것이 있었다. 나 또한 이 방법을 포함한 방법이라 생각하였으나 [-1,2,-3,4] 이 경우에는 2,3,4 를 뽑는 것이 아닌 -1,-3,4 를 뽑아야 하기 때문에 내 코드가 틀렸던 것 이다.
레퍼런스 답변은 전체를 올리지 않고 핵심만 올리고 해석해보겠다.
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);