본문 바로가기
자료구조 알고리즘/코딩테스트 풀이

프로그래머스 Lv0 최댓값 만들기(2)

by 쿠리의일상 2023. 2. 19.
문제 설명
정수 배열 numbers가 매개변수로 주어집니다.
numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
-10,000 ≤ numbers의 원소 ≤ 10,0002 ≤ numbers 의 길이 ≤ 100

 

접근방법

  1. 주어진 배열을 양수 배열과 음수 배열로 나눠서 처리해준다.
  2. 배열 내장 메서드인 sort로 각각의 음수양수 배열을 정렬해준다. (Math.max()도 괜찮을 듯)
  3. 음수 배열의 경우는 0번째, 1번째를 곱한 값이 최댓값이 될거고
  4. 양수 배열의 경우는 length-1과 length-2번째를 곱한 값이 최댓값이 될 것이다
  5. 음수나 양수가 없는 리스트가 주어질 수 있으므로 그 조건식으로 한차례 걸러준다.

 

대충 이렇게까지 했을 때 테스트 케이스 7번에서 자꾸 실패가 떴다.

그래서 뭔가 싶다가... 생각해보니 주어지는 배열이 양수, 음수 두가지만 들어오는 경우를 생각 못했기에 그 부분을 가장 처음 조건에 넣어줘서 성공했다.

 

function solution(numbers) {
  let answer = 0;
  if(numbers.length < 3) {
    return numbers[0] * numbers[1];
  }

  let plusNums = [];
  let minusNums = [];
  for(let i = 0; i < numbers.length; i++) {
      if(numbers[i] > 0) {
          plusNums.push(numbers[i]);
      } else {
          minusNums.push(numbers[i]);
      }
  }
  plusNums.sort((a,b)=> a-b);
  minusNums.sort((a,b)=> a-b);
  
  const plusMax = plusNums[plusNums.length - 1];
  const plusMaxSecond = plusNums[plusNums.length - 2];
  const minusMax = minusNums[0];
  const minusMaxSecond = minusNums[1];
  console.log(plusMax, plusMaxSecond, minusMax, minusMaxSecond);

  if(plusNums.length === 0) {
      answer = minusMax * minusMaxSecond;
  } else if (minusNums.length === 0) {
      answer = plusMax * plusMaxSecond;
  } else {
    if(plusMax * plusMaxSecond > minusMax * minusMaxSecond) {
      answer = plusMax * plusMaxSecond;
    } else if (plusMax * plusMaxSecond < minusMax * minusMaxSecond) {
      answer = minusMax * minusMaxSecond;
    } else {
      if(plusMax === undefined || plusMaxSecond === undefined) {
        answer = minusMax * minusMaxSecond;
      } else if (minusMax === undefined || minusMaxSecond === undefined) {
        answer = plusMax * plusMaxSecond;
      }
    }
  }
  
  return answer;
}