const largestProductOfThree = function (arr) {
let sorted = arr.sort((a,b) => b - a); //크기순 정렬(큰 -> 작)
let result;
result = sorted[0] * sorted[1] * sorted[2]
return result
};
이렇게 작성하고 테스트를 돌려보니, 가장 큰 3개의 수가 모두 음수이거나 모두 양수일때는 통과했지만, 양수와 음수를 함께 곱한 값으로 최대곱을 만들어야하는 경우에는 통과하지 못했다.
통과하지 못한 테스트 입력값으로 최대곱이 어떤 조합으로 이루어져야하는지 살펴봤다. (아래의 배열은 입력받은 배열을 크기가 큰 순으로 정렬한 배열이다.)
세 경우 모두 음수 2개의 곱과 양수 1개의 조합으로 최대곱이 만들어진다. 음수 2개를 곱하면 양수가 되기때문에 절대값이 큰 두 음수 곱에 최대값(양수)를 곱하는 조합이 베스트다! 인덱스로 접근해서 이 조합의 곱을 구하는 변수를 하나 만들어주고, 마지막에 기존에 구한 최대곱과 최종 비교를 해줬다.
sort()
메서드는 원배열을 정렬하기 때문에, 배열을 복사해서 정렬해줬다.
const largestProductOfThree = function (arr) {
let sorted = arr.slice().sort((a,b) => b - a);
let result= sorted[0] * sorted[1] * sorted[2]
let compare = sorted[0] * sorted[sorted.length -2] * sorted[sorted.length -1]
return result > compare? result : compare
};
레퍼런스 코드처럼 마지막 비교 부분은 Math.max()
메서드를 이용할 수 있다. Math.max(result, compare)
또한,sort()
메서드는 원배열을 정렬하기 때문에, 배열을 복사해서 정렬해줬다.
arr.sort([compareFunction])
compareFunction
을 생략하면 요소를 문자열로 변환하고, 각 요소의 유니 코드 코드 포인트 값에 따라 정렬된다. 아래의 mdn 예시처럼 숫자도 문자열로 변환되어 유니코드 순서로 정렬된다.
const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]
const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// expected output: Array [1, 100000, 21, 30, 4]
배열의 요소인 숫자를 크기순으로 정렬하고 싶다면 compareFunction
을 정의해서 전달인자로 넘겨야 한다. compareFunction
이 제공되면 배열 요소는 이 함수의 반환 값에 따라 정렬된다.
const arr = [1, 30, 4, 21, 100000];
arr.sort((a, b) => a - b); //오름차순 정렬 [1, 4, 21, 30, 100000]
arr.sort((a, b) => b - a); //내림차순 정렬 [100000, 30, 21, 4, 1]