본문 바로가기
junior developer :)/알고리즘 & 코딩테스트

알고리즘 (n개 중 3개의 요소를 곱해 나올 수 있는 최대값 구하기(sort())

by ㅁ윤슬ㅁ 2022. 10. 21.
728x90
반응형
Q. 정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.

내가 시도한 방법

길고 길고...for문을 3번 돌려 모든 요소를 다 곱한 다음 전 곱한 값과 비교해서 더 큰 값을 지정해주는 방식으로 해보려고 했다

하지만 요소가 4개인 경우 경우의 수 (123,124,134,234) 5개인 경우(123,124,125,134,145,234,235,245,345) ...
일일히 다 곱하기엔 시간이 너무 오래걸릴 듯 싶었다

const largestProductOfThree = function (arr) {
  // n개중 3개를 곱해 나올 수 있는 최대값 리턴

  let maxMul = 1
  let multi = 1
  // let multi2 = -1
  if(arr.length === 3) // 배열의 갯수가 3인 경우는 전체 요소들 곱 리턴
  {
    return arr[0] * arr[1] * arr[2]
  }

  for(let i = 0; i<arr.length; i++)
  
  {
    for(let j = i+1; j<arr.length; j++)
    {
      for(let k = j+1; k<arr.length; k++)
      {
        multi = arr[i] * arr[j] * arr[k]
        if(maxMul < multi)
          maxMul = multi
      }
    }
  }
  return maxMul
};

이렇게 구현은 해봤지만 세 요소를 곱한 값이 음수일 경우를 예외처리 하지 못했다
물론,,음수일 경우의 예외처리'만'은 가능했지만 다른 부분에서 꼬였다

그래서 찾아보게 된 다른 방식

const largestProductOfThree = function (arr) {
  const sorted = arr.sort(function (a, b) {return a - b});
  // const sorted = arr.sort((a, b) => (a - b));
  // sort 함수를 이용해 숫자 크기대로 정렬된다

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

일단 코드 길이부터 너무 큰 차이가 났다

이 코드는 sort. 즉, 정렬을 우선 시킨 뒤 가장 클 수 있는 뒤에서 세개를 곱한 값, 가장 뒤에 요소와 앞의 요소 두개를 곱한 값을 비교해서 큰 값을 리턴 시켰다

사용한 메서드

sort() : 값을 정렬하는 메서드이다

이 함수는 compareFunction이 제공되지 않으면 요소를 문자열로 변환 한 뒤 유니 코드 순서로 문자열을 비교해서 정렬한다.
즉, [1,2,300,10,9,20]이 있으면 [1,2,9,10,20,300]이 아니라 [1,10,2,20,300,9]로 정렬된다는 말.

문자열 대신 숫자를 비교하기 위해 compare 함수는 a에서 b를 뺄 수 있다.
다음 함수는 배열을 오름차순으로 정렬한다 (Infinity 및 NaN이 포함되어 있지 않은 경우).

function compareNumbers(a, b) {
  return a - b;
}

Math.max(): 최댓값을 구하는 메서드이다

728x90
반응형