LeetCode - 66. Plus One

henu·2023년 8월 29일
0

LeetCode

목록 보기
15/186
post-thumbnail

Solution

var plusOne = function(digits) {
    return [...(BigInt(digits.join(''))+BigInt(1)) + '']
};

Explanation

처음 접했을때는 쉽고 간단한 문제인 줄 알았는데 복병이 숨어있었다.

return [...String(+digits.join('') + 1)]

위와 같이 단순하게 작성했는데 한 테스트케이스가 통과되지 않았다.
input이 [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3]일때
output이 [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]이 출력되었다.
input에 1을 더했는데 수가 작아졌다. 검색해보니 Javascript는
-9007199254740991(2의53제곱-1) ~ +9007199254740991(2의53제곱-1) 범위의 정수만 안전하게 표현할 수 있다.
Number.MAX_SAFE_INTEGER 참고
mdn 설명에 따르면, 여기서 안전하게란 정수를 정확하게 표현하고 올바르게 비교할 수 있다는 것을 의미한다. 예를 들어, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2은 true로 평가된다. 하지만 수학적으로는 전혀 올바르지 않다.
위의 input은 Number.MAX_SAFE_INTEGER보다 훨씬 더 큰 수여서 연산을 했을때 올바르게 표현되지 않아서 저런 결과가 나온 것 같다.
그래서 Number.MAX_SAFE_INTEGER보다 더 큰 수를 다룰 때는 BigInt를 사용해야한다.
BigInt 참고
함수 BigInt()를 호출하여 생성할 수 있다.
BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없고, 연산에서 Number와 혼합해 사용할 수 없다. 따라서 먼저 같은 타입으로 변환해야 합니다.
그래서 1을 더할 때 BigInt로 변환해줘야 오류가 발생하지 않는다.

0개의 댓글