ALGORITHM
문제 1) 최대 곱
일태찡
2023. 2. 18. 20:48
정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최댓값을 리턴해야 합니다.
- 입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다.
- 배열의 요소는 음수와 0을 포함하는 정수입니다.
- 배열의 길이는 3 이상입니다.
처음에 간단히 생각해서 그냥 내림차순으로 값 정렬하고 앞에 숫자 3개를 곱하면 끝난다 생각했지만.. 음수를 생각에서 배제하고 있었다... 그래서 양수의 개수에 따라 조건을 나눠 풀 수 있었다.
const largestProductOfThree = function (arr) {
// 일단 내림차순으로 값을 정렬
let result = arr.sort((a,b) => b - a);
// 양수의 개수에 따라 조건을 달리 해줘야 하므로 양수의 개수를 구함
let positive = result.filter(el => el > 0).length
if (positive === 0) {
// 모두 음수면 최대 곱은 음수를 벗어날 수 없으므로 내림차순으로 정렬시 가장 큰 값 3개를 곱함
return result[0] * result[1] * result[2];
} else if (positive === 1 || positive === 2) {
// 양수가 1개이거나 2개면 양수 1개와 음수 2개를 곱해야 가장 큰 양수가 나옴
return result[0] * result[result.length-1] * result[result.length-2];
} else if (positive >= 3) {
// 양수가 3개 이상이면 양수 3개를 곱하거나 양수 1개와 음수 2개를 곱해야 함
if (result[1] * result[2] > result[result.length-1] * result[result.length-2]) {
// 가장 큰 양수를 제외하고 가장 작은 음수 두 개의 곱과 두세번째 양수의 곱을 비교
return result[0] * result[1] * result[2];
} else {
return result[0] * result[result.length-1] * result[result.length-2];
}
}
전달인자로 받은 배열의 양수의 개수에 따라서 반환을 달리 해서 해결은 했지만.. 코드가 난잡하고 레퍼런스를 보며 생각해 보니 내가 반환하는 값은 결국 둘 중에 하나였다.. 조건을 세분화해서 나눴지만 결국 어느 조건에서든 두 값 중 큰 값이 리턴된다... 그래서 수정해 보자면!
const largestProductOfThree = function (arr) {
arr.sort((a,b) => b - a);
let result1 = arr[0] * arr[1] * arr[2];
let result2 = arr[0] * arr[arr.length-1] * arr[arr.length-2];
return Math.max(result1, result2);
}
이렇게 그냥 두 값을 결과의 후보로 설정하고 Math.max()를 활용하여 후보 중 큰 값을 반환하는 식으로 간단히 끝낼 수 있었다. 조건 세분화의 함정에 빠져 큰 그림을 보지 못했다.. ㅠ_ㅠ