새소식

프론트엔드 공부/자료구조 & 알고리즘

정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.

  • -

largestProductOfThree

문제

정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.

입력

인자 1 : arr

  • number 타입을 요소로 갖는 임의의 배열

출력

  • number 타입을 리턴해야 합니다.

주의사항

  • 입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다.
  • 배열의 요소는 음수와 0을 포함하는 정수입니다.
  • 배열의 길이는 3 이상입니다.

입출력 예시

let output = largestProductOfThree([2, 1, 3, 7]);
console.log(output); // --> 42 (= 2 * 3 * 7)

output = largestProductOfThree([-1, 2, -5, 7]);
console.log(output); // --> 35 (= -1 * -5 * 7)

코드작성

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)
};
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.