[JS]_daily coding #22

seul·2022년 6월 23일
0

Algorithm

목록 보기
21/31

코플릿 데일리코딩 01_largestProductOfThree 풀이


처음 생각한 수도코드

  1. 입력받은 배열의 3개 요소를 곱해서 나올 수 있는 최대값을 리턴해야 한다 (배열의 요소는 음수와 0을 포함하는 정수)
  2. sort() 메서드를 사용해서 배열을 크기순으로 정렬
  3. 0 - 2 인덱스의 곱 (배열에서 가장 큰 수 3개의 곱)
  4. 결과 반환

코드

const largestProductOfThree = function (arr) {
  let sorted = arr.sort((a,b) => b - a);  //크기순 정렬(큰 -> 작)
  let result;
  result = sorted[0] * sorted[1] * sorted[2] 
  return result
};

이렇게 작성하고 테스트를 돌려보니, 가장 큰 3개의 수가 모두 음수이거나 모두 양수일때는 통과했지만, 양수와 음수를 함께 곱한 값으로 최대곱을 만들어야하는 경우에는 통과하지 못했다.

통과하지 못한 테스트 입력값으로 최대곱이 어떤 조합으로 이루어져야하는지 살펴봤다. (아래의 배열은 입력받은 배열을 크기가 큰 순으로 정렬한 배열이다.)

  • [7, 5, 3, 2, -11, -13] => 7 -11 -13
  • [40, -5, -20, -30, -50] -> 40 -30 -50
  • [10000, 999, -1, -3, -4, -5] -> 10000 -4 -5

세 경우 모두 음수 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()메서드는 원배열을 정렬하기 때문에, 배열을 복사해서 정렬해줬다.

remind

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]

참고

MDN _ Array.prototype.sort()

profile
Connecting dots

0개의 댓글