const largestProductOfThree = function (arr) {
// 입력 배열을 내림차순으로 정렬합니다.
arr.sort((a, b) => b - a);
// 정렬된 배열의 첫 3개 원소의 곱의 최대값과
// 가장 큰 원소와 가장 작은 두 원소의 곱의 최대값 중 큰 값을 반환합니다.
return Math.max(arr[0] * arr[1] * arr[2], arr[0] * arr[arr.length - 1] * arr[arr.length - 2]);
};
우선, arr 배열을 sort 메서드를 사용하여 내림차순으로 정렬합니다. sort 메서드는 배열의 원소를 정렬하여 정렬된 배열을 반환합니다. 비교 함수 (a, b) => b - a는 원소를 내림차순으로 정렬합니다.
그 다음, Math.max 함수를 사용하여 두 값 중 큰 값을 반환합니다. 첫 번째 값은 정렬된 배열의 첫 3개 원소의 곱입니다 (arr[0] * arr[1] * arr[2]), 두 번째 값은 가장 큰 원소와 가장 작은 두 원소의 곱입니다 (arr[0] * arr[arr.length - 1] * arr[arr.length - 2]). 이 두 값 중 큰 값이 함수의 결과 값으로 반환됩니다.
여기서 arr.length - 1은 배열의 마지막 원소의 인덱스를 나타냅니다. 따라서, arr[arr.length - 1]은 배열의 마지막 원소를 가리킵니다. 마찬가지로, arr[arr.length - 2]는 마지막에서 두 번째 원소를 가리킵니다.
return Math.max(arr[0] * arr[1] * arr[2], arr[0] * arr[arr.length - 1] * arr[arr.length - 2]);이 부분은 배열의 첫 번째 원소 (arr[0])을 곱하고, 두 번째 원소 (arr[1])와 마지막 원소 (arr[arr.length - 1])를 곱한 결과와 마지막에서 두 번째 원소 (arr[arr.length - 2])와 첫 번째 (arr[0])와 마지막 원소 (arr[arr.length - 1])를 곱한 결과를 비교하여, 큰 값을 반환합니다.
Math.max 메서드는 여러 개의 숫자 중 가장 큰 숫자를 반환합니다. 예를 들어, Math.max(1, 2, 3)을 실행하면 3이 반환됩니다.
즉, arr[0] * arr[1] * arr[2]은 배열의 첫 번째, 두 번째, 세 번째 원소의 곱입니다. 반면, arr[0] * arr[arr.length - 1] * arr[arr.length - 2]는 배열의 첫 번째, 마지막, 마지막에서 두 번째 원소의 곱입니다. 이 두 값 중 큰 값이 함수의 결과 값으로 반환됩니다.
만약 arr[0] * arr[arr.length - 1] * arr[arr.length - 2] 이 부분이 없으면, 음수를 입력받았을 때 결과가 정상적으로 나오지 않을 수 있습니다.
예를 들어, [-1, -2, -3]이라는 배열이 입력되었을 때 결과는 -6이 되어야 하지만, Math.max 메서드가 첫 번째, 두 번째, 세 번째 원소의 곱만 고려하게 되므로 -6이 나오지 않을 가능성이 있습니다. 따라서, arr[0] * arr[arr.length - 1] * arr[arr.length - 2]이 부분이 있어야 음수를 입력받았을 때도 정상적으로 결과가 나오게 됩니다.
예를 들어, [-3, -2, -1, 4, 5]라는 배열이 주어졌다고 가정해봅시다.
위 배열에서 가장 큰 수 3개는 4, 5, -1입니다. 따라서, Math.max(arr[0] * arr[1] * arr[2], arr[0] * arr[arr.length - 1] * arr[arr.length - 2])는 5 * 4 * (-3) = -60이 됩니다.
만약 arr[0] * arr[arr.length - 1] * arr[arr.length - 2]이 없다면, Math.max(arr[0] * arr[1] * arr[2])만 실행될 것이고, 이 경우 결과는 -6이 됩니다. 이는 올바른 결과가 아닙니다.
레퍼런스코드
// 레퍼런스코드
const largestProductOfThree = function (arr) {
let list = arr.sort((a,b)=>a-b)
const v1 = list[list.length-1]*list[list.length-2]*list[list.length-3]
const v2 = list[list.length-1]*list[0]*list[1]
return Math.max(v1,v2)
};