자바스크립트로 알고리즘 문제를 풀다가 난관에 봉착했다.
문제에서 주어진 값의 범위는 2^62
이하로 아주 큰 정수였다.
자바스크립트의 Number
타입은 정수를 안정적으로 나타낼 수 있는 값이 한정적이라 큰 수를 다룰 때 아래처럼 값의 정확도를 잃게 된다.
자바스크립트에 내장된 객체인 BigInt
를 사용해 이를 해결할 수 있다.
위와같이 숫자뒤에 n
을 붙이거나 BigInt()
를 호출해서 값을 생성할 수 있다.
Number
로 표현했을때 Infinity
가 되는 아주 큰 값도 BigInt
로 정수형태를 잃지 않고 표현할 수 있다.
다만 연산할 때는 Number
와 함께 연산할 수 없고, BigInt
끼리만 연산 가능하다.
또한 max,min,abs
등 Math
객체의 함수들도 사용할 수 없다.
arr = [-3n,-5n,-9n,6n,10n]
> (5) [-3n, -5n, -9n, 6n, 10n]
arr.sort()
> (5) [-3n, -5n, -9n, 10n, 6n]
위에서 볼 수 있듯이 자주 사용되는 Array
의 내장함수인 sort
함수도 BigInt
가 담긴 배열에 사용했을 때 잘못된 결과를 도출하기 때문에,
이들을 정렬할 때는 직접 sort
함수를 구현해야 한다.