문제 설명
정수 배열 numbers가 매개변수로 주어집니다.
numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.
제한사항
-10,000 ≤ numbers의 원소 ≤ 10,0002 ≤ numbers 의 길이 ≤ 100
접근방법
- 주어진 배열을 양수 배열과 음수 배열로 나눠서 처리해준다.
- 배열 내장 메서드인 sort로 각각의 음수양수 배열을 정렬해준다. (Math.max()도 괜찮을 듯)
- 음수 배열의 경우는 0번째, 1번째를 곱한 값이 최댓값이 될거고
- 양수 배열의 경우는 length-1과 length-2번째를 곱한 값이 최댓값이 될 것이다
- 음수나 양수가 없는 리스트가 주어질 수 있으므로 그 조건식으로 한차례 걸러준다.
대충 이렇게까지 했을 때 테스트 케이스 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;
}
'자료구조 알고리즘 > 코딩테스트 풀이' 카테고리의 다른 글
프로그래머스 소인수분해 (0) | 2023.03.06 |
---|---|
프로그래머스 Lv0 직각삼각형 출력하기 (0) | 2023.02.19 |
백준 5597번 과제 안 내신 분? (0) | 2023.02.16 |
백준 4344번 평균은 넘겠지 (0) | 2023.02.12 |
백준 2884 자바스크립트(node js) (0) | 2023.02.02 |