728x90
반응형
Q. 정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.
내가 시도한 방법
길고 길고...for문을 3번 돌려 모든 요소를 다 곱한 다음 전 곱한 값과 비교해서 더 큰 값을 지정해주는 방식으로 해보려고 했다
하지만 요소가 4개인 경우 경우의 수 (123,124,134,234) 5개인 경우(123,124,125,134,145,234,235,245,345) ...
일일히 다 곱하기엔 시간이 너무 오래걸릴 듯 싶었다
const largestProductOfThree = function (arr) {
// n개중 3개를 곱해 나올 수 있는 최대값 리턴
let maxMul = 1
let multi = 1
// let multi2 = -1
if(arr.length === 3) // 배열의 갯수가 3인 경우는 전체 요소들 곱 리턴
{
return arr[0] * arr[1] * arr[2]
}
for(let i = 0; i<arr.length; i++)
{
for(let j = i+1; j<arr.length; j++)
{
for(let k = j+1; k<arr.length; k++)
{
multi = arr[i] * arr[j] * arr[k]
if(maxMul < multi)
maxMul = multi
}
}
}
return maxMul
};
이렇게 구현은 해봤지만 세 요소를 곱한 값이 음수일 경우를 예외처리 하지 못했다
물론,,음수일 경우의 예외처리'만'은 가능했지만 다른 부분에서 꼬였다
그래서 찾아보게 된 다른 방식
const largestProductOfThree = function (arr) {
const sorted = arr.sort(function (a, b) {return a - b});
// const sorted = arr.sort((a, b) => (a - b));
// sort 함수를 이용해 숫자 크기대로 정렬된다
const len = arr.length;
const candi1 = sorted[len - 1] * sorted[len - 2] * sorted[len - 3];
const candi2 = sorted[len - 1] * sorted[0] * sorted[1];
return Math.max(candi1, candi2);
};
일단 코드 길이부터 너무 큰 차이가 났다
이 코드는 sort. 즉, 정렬을 우선 시킨 뒤 가장 클 수 있는 뒤에서 세개를 곱한 값, 가장 뒤에 요소와 앞의 요소 두개를 곱한 값을 비교해서 큰 값을 리턴 시켰다
사용한 메서드
sort() : 값을 정렬하는 메서드이다
이 함수는 compareFunction이 제공되지 않으면 요소를 문자열로 변환 한 뒤 유니 코드 순서로 문자열을 비교해서 정렬한다.
즉, [1,2,300,10,9,20]이 있으면 [1,2,9,10,20,300]이 아니라 [1,10,2,20,300,9]로 정렬된다는 말.
문자열 대신 숫자를 비교하기 위해 compare 함수는 a에서 b를 뺄 수 있다.
다음 함수는 배열을 오름차순으로 정렬한다 (Infinity 및 NaN이 포함되어 있지 않은 경우).
function compareNumbers(a, b) {
return a - b;
}
Math.max(): 최댓값을 구하는 메서드이다
728x90
반응형
'junior developer :) > 알고리즘 & 코딩테스트' 카테고리의 다른 글
[알고리즘]오름차순으로 정렬하기_JS(버블정렬, 선택정렬) (0) | 2022.11.01 |
---|---|
알고리즘_ fibonacci 수열 구현하기 (JS/시간복잡도에 따른 두가지 구현 방식 비교) (0) | 2022.10.25 |
재귀함수에 대해서_factorial (+ 논리 곱 & 논리 합) (0) | 2022.10.20 |
알고리즘_ 바빌로니아법으로 제곱근 구하기(toFixed()) (0) | 2022.10.14 |
알고리즘 연습_이차원 배열 안에서 특정 문자 찾기 (0) | 2022.10.14 |