정수를 요소로 갖는 배열을 입력받아 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)
세 수의 곱의 최댓값을 찾는 문제다. 너무 어렵게 생각하지 않고 바로 3중 for문을 돌렸다. 그중에서 중복된 수는 없어야 하기 때문에 인덱스가 같아지면 건너 뛰도록 continue
를 실시해주었다. 그리고 그렇게 담긴 배열에서 최댓값을 찾는 것을 코드로 작성 해보았다.
const largestProductOfThree = function (arr) {
// TODO: 여기에 코드를 작성합니다.
let result = [];
for(let i = 0; i < arr.length; i++){
for(let j = 0; j < arr.length; j++){
if(i === j){
continue;
}
for(let z = 0; z < arr.length; z++){
if(i === z || j === z){
continue;
}
result.push(arr[i]*arr[j]*arr[z]);
}
}
}
let max = result[0];
for(let i = 0; i < result.length; i++){
if(result[i] > max){
max = result[i]
}
}
return max;
};
위 코드를 실행한다면 모든 테스트를 무사히 통과 할 수 있다. 하지만 이 과정에서 한가지 실수가 있었는데 바로 처음 max
값을 0으로 줬던 것이다.
여기서 곱해서 나오는 값이 음수일 수도 있다는 걸 간과했다 그래서 이후에는 그냥 배열의 첫번 째 값을 max
에 할당해줌으로 문제를 해결했다.
이번 문제는 생각보다 간단하게 해결할 수 있었다. 레퍼런스가 어떤 코드일지는 아직 모르겠지만 내 코드와 크게 벗어나지 않을 것 같다.
만약에 3수의 곱이 아니라 무작위의 수를 입력받는다면 어떻게 해야할까? 고민해보았다 그때는 재귀함수를 통해서 원하는 횟수 만큼 실행해주면 될 것 같았다.