var plusOne = function(digits) {
return [...(BigInt(digits.join(''))+BigInt(1)) + '']
};
처음 접했을때는 쉽고 간단한 문제인 줄 알았는데 복병이 숨어있었다.
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로 변환해줘야 오류가 발생하지 않는다.