JavaScript Number.MIN_SAFE_INTEGER

Theo·2024년 5월 11일

JavaScript

목록 보기
2/2
post-thumbnail

✏️프로그래머스 최댓값 만들기 (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]);
}
profile
Logbook

0개의 댓글