배열의 세개 요소 곱의 최대값

Creating the dots·2021년 7월 31일
1

Algorithm

목록 보기
7/65

문제

정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴하라.
배열은 0,음수,양수를 포함한 최소 3개 이상의 요소를 갖는다.

const largestProductOfThree = function (arr) {

  const sorted = arr.slice().sort((a,b) => a-b);
  const len = arr.length;
  
  const candi1 = arr[len-1] * arr[len-2] * arr[len-3];
  const candi2 = arr[len-1] * arr[0] * arr[1];
  
  return Math.max(candi1,candi2);
};

왜 오름차순으로 정렬해?

오름차순으로 정렬하면, 요소들의 곱을 구할때, 모두 양수인 경우, 모두 음수인 경우, 음수와 양수가 모두 포함된 경우 등 다양한 경우의 수를 논리적으로 분리할 수 있게 된다.

candi1과 candi2의 의미

const candi1 = arr[len-1] * arr[len-2] * arr[len-3];
const candi2 = arr[len-1] * arr[0] * arr[1];
  • candi1이 최대값인 경우는 언제일까?
    • arr의 모든 요소들이 양수일때
    • arr의 모든 요소들이 음수일때
    • arr[0] < 0
      • arr[1] < 0 && Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) < arr[len-2]
      • arr[1] === 0
      • arr[1] < 0 && arr[len-2] !==0 && arr[len-3] !== 0
  • candi2가 최대값인 경우
    • 그 외의 모든 경우
//arr[0] < 0 && arr[1] < 0
  //Math.abs(arr[0]) >= arr[len-1] 
  const arr = [-5, -2, 1, 2, 5]이라면,
  candi1 = 1 * 2 * 5; //10
  candi2 = (-5) * (-2) * 5; //50
  Math.max(candi1, candi2) = candi2 

  //Math.abs(arr[0]) >= arr[len-1] 
  const arr = [-5, -1, 1, 2, 5]이라면,
  candi1 = 1 * 2 * 5; //10
  candi2 = (-5) * (-1) * 5; //25
  Math.max(candi1, candi2) = candi2
	
  //Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) < arr[len-2] 
  const arr = [-5, -1, 1, 2, 10]이라면,
  candi1 = 1 * 2* 10; //20
  candi2 = (-5) * (-1) * 10 //50
  Math.max(candi1, candi2) = candi2

 //Math.abs(arr[0]) < arr[len-1] && Math.abs(arr[1]) >= arr[len-1]
  const arr = [-9, -8, 3, 8, 10]이라면,
  candi1 = (-9) * (-8) * 10; //720  
  candi2 = 3 * 8 * 10 //240
  Math.max(candi1, candi2) = candi1
    
//arr[0] < 0 && arr[1] === 0
  //Math.abs(arr[0]) >= arr[len-1]
  const arr = [-5, 0, 1, 2, 5]이라면,
  candi1 = 1 * 2 * 5; //10
  candi2 = (-5) * 0 * 5; //0
  Math.max(candi1, candi2) = candi1

//arr[0] < 0 && arr[1] > 0
  //Math.abs(arr[0] >= arr)
  const arr = [-5, 2, 3, 4, 5]이라면,
  candi1 = 3 * 4 * 5; //60
  candi2 = (-5) * 2 * 3; //-30
  Math.max(candi1, candi2) = candi1
  
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글