알고리즘
largestProductOfThree 문제풀이
칠뎁
2022. 8. 26. 18:11
문제:
정수를 요소로 갖는 배열을 입력받아 3개의 요소를 곱해 나올 수 있는 최대값을 리턴해야 합니다.
입력:
인자1 : arr |
|
출력:
- number 타입을 리턴해야 합니다.
주의사항:
- 입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다.
- 배열의 요소는 음수와 0을 포함하는 정수입니다.
- 배열의 길이는 3 이상입니다.
입출력 예시:
let output = largestProductOfThree([2, 1, 3, 7]);
console.log(output); // --> 42 (= 2 * 3 * 7)
output = largestProductOfThree([-1, 2, -5, 7]);
console.log(output); // --> 35 (= -1 * -5 * 7)
📝 이 문제는...
생각없이 풀면 삼중으로 for문을 돌려야 하는데, 좀 더 생각하면 for문을 1도 안쓰고 풀 수 있는 문제이다.
케이스를 직접 작성해보며 문제의 답을 유형화 시키면 잘 풀 수 있다.
첫번째 풀이: 삼중 for문
const largestProductOfThree = function (arr) {
const multi = []
for (let i=0; i< arr.length; i++) {
const remove01 = arr.slice()
remove01.splice(i,1)
for(let j=0; j<remove01.length; j++){
const remove02 = remove01.slice()
remove02.splice(j,1)
for(let k=0; k<remove02.length; k++){
multi.push(arr[i]*remove01[j]*remove02[k])
}
}
}
return Math.max(...multi)
};
가장 처음 내가 풀었던 풀이 방식이다.
3개의 숫자를 곱해서 가장 큰 것을 구해야 하기 때문에,
일단 구할 수 있는 모든 숫자를 다 해보고, 그 중 가장 큰 것을 찾기로 했다.
다른 풀이 방식을 보니 아주 무식한 방법이 아닐 수 없다.
두번째 풀이: sort + 케이스 스터디
const largestProductOfThree = function (arr) {
arr.sort((a,b)=>a-b)
const endIdx = arr.length - 1
//음수가 두개이상일 경우 대비
candi1 = arr[0] * arr[1] * arr[endIdx]
//가장 큰수 세개 곱하기
candi2 = arr[endIdx - 2] * arr[endIdx - 1] * arr[endIdx]
return Math.max(candi1,candi2)
}
위의 풀이 방법은 아래의 케이스 스터디를 통해 가장 큰 곱이 나올 경우를 유형화 시켜야 한다.
[-10,-3,-5,0,1,2,4] //-10 * -3 * 4 = 120
[-2,-1,0,5,6,7] //5 * 6 * 7 = 210
[-100,-99,-10,-2,-1] //-10 * -2 * -1 = -20
[0,1,2,10,99,100] //10 * 99 * 100
따라서 오름차순으로 정렬된 배열에서
3가지 수를 곱해서 가장 큰 수가 나올 경우의 수는 아래의 두가지 이다.
1️⃣. 첫번째 요소 * 두번째 요소 * 마지막 요소
2️⃣. 마지막 요소 * 마지막에서 두번째 요소 * 마지막에서 세번째 요소