✏️프로그래머스 최댓값 만들기 (2) 문제중 발생한 오류 수정방법
💢 Code중 let maxNum의 값을 0 으로 했을 시 10개의 실행 결과중 1개의 오류가 발생.
function solution(numbers) {
let maxNum = 0
for (let i = 0; i < numbers.length; i++) {
for (let j = 0; j < numbers.length; j++) {
if (i !== j) {
let addNum = numbers[i] * numbers[j];
if (maxNum < addNum) {
maxNum = addNum;
}
}
}
}
return maxNum;
}
- 어떻게 오류가 발생하였는지? 왜 1개의 오류만 발생 했는지에 대한 이유를 알 수 없었습니다.
- 그 당시 반복문에는 오류가 없다고 생각되어 maxNum을 0으로 하여 오류가 발생이 되었는지 의문을 가졌습니다.
- 배열에 양수만 있는것이 아닌 음수도 포함이 되어 있기 때문인가? 라는 생각으로 코드의 수정을 시도 하였습니다.
⚡️maxNum의 값을 0 -> Number.MIN_SAFE_INTEGER으로 변경
let maxNum = Number.MIN_SAFE_INTEGER;
- maxNum의 값을 0에서 Number.MIN_SAFE_INTEGER로 변경 후 오류없이 실행이 완료됨.
Number.MIN_SAFE_INTEGER란?
- JavaScript에서 안전하게 표현할 수 있는 가장 작은 정수 값을 나타냅니다.
- 이 값은 -9007199254740991이며, 이는 2^53 −1의 음수 값입니다. JavaScript에서는 Number 타입이 IEEE 754 표준을 따르는 부동소수점 형식을 사용하기 때문에, 정밀도를 완벽히 보장할 수 있는 가장 큰 정수 범위가 제한되어 있습니다.
Number.MIN_SAFE_INTEGER의 사용
- 일반적으로 큰 수의 계산에서 정수 오버플로우나 언더플로우를 방지하고, 알고리즘에서 초기 비교값으로 사용될 때 유용합니다.
- 예를 들어, 최대값을 찾는 로직에서 초기 비교 대상으로 사용할 수 있습니다. 이 값보다 작은 정수는 JavaScript에서 안전하게 처리할 수 없으므로, 연산 중에 발생할 수 있는 예기치 못한 오류를 예방하는 데 도움이 됩니다.
Number.MIN_SAFE_INTEGER의 사용 예
let minValue = Number.MIN_SAFE_INTEGER;
console.log(minValue); // 출력: -9007199254740991
let values = [-10, -9007199254740992, -9007199254740991, -9007199254740990];
let min = Number.MIN_SAFE_INTEGER;
for (let value of values) {
if (value > min) {
min = value;
}
}
console.log(min); // 출력: -9007199254740990
결론
- 정수의 안전한 계산을 위해서는 Number.MIN_SAFE_INTEGER이 권장되는 것 같다.
- 최대값을 찾는 로직에서 초기 비교 대상으로 사용할 수 있다.
최종코드
function solution(numbers) {
let maxNum = Number.MIN_SAFE_INTEGER;
for (let i = 0; i < numbers.length; i++) {
for (let j = 0; j < numbers.length; j++) {
if (i !== j) {
let addNum = numbers[i] * numbers[j];
if (maxNum < addNum) {
maxNum = addNum;
}
}
}
}
return maxNum;
}
최종코드의 내용이 for문이 2번 반복되어 좋지 않다고 판단, sort()를 활용한 오름차순 으로 전체코드를 수정
function solution(numbers) {
let lenArr = numbers.length;
numbers.sort((a, b) => a - b);
return Math.max(numbers[0] * numbers[1], numbers[lenArr-1] * numbers[lenArr-2]);
}