Javascript # 알고리즘

kdobro_dev·2022년 1월 26일
0

Algorithm

목록 보기
4/7
post-thumbnail

📝오늘 배운 내용

문제

정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.
arr이란 배열에 요소들의 중 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)

입출력 예시를 보면, arr = [2, 1, 3, 7]이 들어있다고 가정했을 때, 이 중 3가지의 요소를 곱해서 나올 수 있는 최대값은 (2 x 3 x 7)이 되며 42를 출력할 수 있다.
처음에는 양수와 음수를 따로 나누어 음수를 양수로 전부 바꿔준 후 sort메소드를 사용해서 오름차순으로 정렬을 한 후에 가장 큰 3개의 수로 곱을 하는 방법을 생각했었다. 아래의 코드처럼 굉장히 복잡하게 생각하여 작성을 해봤는데 총 9개의 테스트 중 2개의 테스가 통과되지 않았다. 통과되지 않은 테스트는 arr = [-5, -4, -3, -2, -1] 일 때 출력값은 (-3 x -2 x -1)로 -6이 나와야 하는데 내가 작성한 코드에 대입하여 풀어보면 모두 양수로 바꾼 후 오름차순 정렬을해서 [1, 2, 3, 4, 5]가 되고 (3 x 4 x 5)가 되서 60이 나와 통과가 되지 않는 것이었다.

const biggerThanZero = arr.filter((el) => el >= 0); // 양수
const smallerThanZero = arr.filter((el) => el < 0); // 음수
const negToPos = smallerThanZero.map((el) => el * -1); // 음수를 양수로
const newArr = biggerThanZero.concat(negToPos); // 원래 있던 양수에 음수를 양수로 바꾼 배열을 합치기
const sortedNewArr = newArr.sort((a, b) => a - b); // 합친 배열 오름차순 정렬
const threeNums = sortedNewArr.slice(-3); // 배열에 마지막에서 3개의 수만 할당
const result = threeNums.reduce((acc, cur) => acc * cur); // 3개의 수의 곱
return result; 

음수를 양수로 바꾸지 않고 해결 할 수 있는 방법을 생각해야했다.

  • 우선 arr의 요소들을 오름차순으로 정렬을 해준다.
  • arr의 길이를 len변수에 담아준다.
  • arr를 오름차순으로 정렬했을 때 가장 마지막 3개의 요소들을 곱한다.
  • arr를 오름차순으로 정렬했을 때 가장 마지막 수 첫 번째 요소 두 번째 요소를 곱한다.
  • 두 가지의 방법 중 더 큰 값을 출력한다.

두 가지의 방법이 필요한 이유는 이렇다.
첫 번째 multiplyOne의 방법은 arr의 요소가 양수 혹은 음수의 요소들로만 있을 때 가능한 방법이다.
오름차순으로 정렬했을 때 가장 큰 수들은 모두 뒤에 있기 때문이다.
두 번째 multiplyTwo의 방법이 필요한 이유는 양수와 음수가 섞여 있을 때의 경우이다.
이것 또한 오름차순으로 정렬했을 때 양수의 가장 큰 수는 가장 마지막에 위치한다. 하지만 음수는 중 값이 가장 큰 값들은 가장 앞에 위치하게된다. 따라서 가장 값이 큰 음수들은 맨 앞에 위치하기 때문에 음수끼리 곱을 하면 양수가 되기 때문에 필요한 방법이다.

const sortedArr = arr.sort((a, b) => a - b);
const len = arr.length;
const multiplyOne = sortedArr[len - 1] * sortedArr[len - 2] * sortedArr[len - 3];
const multiplyTwo = sortedArr[len - 1] * sortedArr[0] * sortedArr[1];
return Math.max(multiplyOne, multiplyTwo);
profile
do your best at any moment

0개의 댓글