문제 설명
정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
- -10,000 ≤ numbers의 원소 ≤ 10,000
- 2 ≤ numbers 의 길이 ≤ 100
풀이
const solution = (numbers) => {
const positive = numbers.filter(el => el >= 0).sort((a,b) => b-a);
const negative = numbers.filter(el => el <= 0).sort((a,b) => b-a);
if(positive.length === 1 && negative.length === 1) return positive[0] * negative[0];
const positiveMax = positive.length > 1 ? positive[0] * positive[1] : positive[0] || 0;
const negativeMax = negative.length > 1 ? negative[0] * negative[1] : negative[0] || 0;
return positiveMax > negativeMax ? positiveMax : negativeMax;
}
뭔가 겁나 무식하게 풀었다.
filter()를 활용해서 양수와 음수를 각각 positive, nagative 배열로 나눠서 담아 둔 뒤, sort()로 내림차순 정렬을 해주었다.
각각 길이가 1이면 ( 양수배열 음수배열이 둘다 1개면 ) 두개를 곱해줘서 리턴해줬고,
그게 아니라면 positiveMax, negativeMax에 각 배열의 길이가 2 이상이면 첫번째 원소와 두번째 원소를 곱한값을,
길이가 1이하라면 첫번째 원소를 넣어주고 만약 없다면 0을 넣어주었다.
그리고 positiveMax가 negativeMax보다 크다면 positiveMax를, 아니라면 negativeMax를 리턴해주었다.
너무 무식하게 푼거 같아서 다른사람의 풀이를 봤는데,
function solution(numbers) {
const N = numbers.length;
numbers.sort((a,b) => a - b);
return Math.max(
numbers[N-1] * numbers[N-2],
numbers[0] * numbers[1]
)
}
이렇게 세련되게 풀 수 도 있었다..
sort()로 오름차순 정렬 해주고, N은 number의 길이로,
마지막, 마지막에서 1번째를 곱해준 값과, 첫번째, 두번째 값을 곱해준 값중 Math.max()로 큰값을 리턴해 주는 방식인듯.
이방법도 생각은 했었는데.. 뭔가 예외가 있지 않을까? 해서 고민했었는데 예외는 없나부다 ;ㅅ;...