백준 24266번을 풀어보았다.
처음에는 동일한 유형인 24262번~24265번과 유사할 거라 생각하여 큰 고민 없이 풀이하였다.
let n = Number(require('fs').readFileSync('/dev/stdin').toString())
console.log(n**3)
console.log(3)
당연히 정답일 줄 알았는데 틀렸습니다가 출력되었다.
알고보니 1≤n ≤500,000의 범위에서 n^2까지는 number 자료형이 표현할 수 있지만
n^3은 number 자료형이 표현할 수 있는 범위를 넘어서는 것이었다.
JavaScript에서 자주 사용되는 숫자 자료형으로는 number와 bigint가 있다.
number
JavaScript의 기본적인 숫자 자료형으로 정수와 부동소수점을 모두 포함한다.
-(2^53-1)~2^53-1의 범위를 표현할 수 있다.
bigint
number의 안전한 범위를 초과하는 정수를 표현할 수 있도록 ES11에서 도입된 숫자 자료형으로 정수만 포함한다.
숫자 뒤에 n을 붙이거나 BigInt() 생성자를 사용해 선언할 수 있으며
표현 가능 범위가 정해져있지 않고 메모리가 허용하는 한도 내에서 매우 큰 숫자를 저장할 수 있다.
정리하면 일반적인 경우 number로도 충분하지만 아주 큰 정수 연산이 필요할 경우 bigint를 사용해야 한다.
즉, 최대 500,000의 세제곱까지 연산해야 하는 이 문제의 경우 n을 number가 아닌 bigint로 선언해야 하고
bigint와 number는 함께 연산할 수 없으므로 n**3은 n**3n으로 연산 후* 다음의 방법으로 변환 후 출력하도록 한다.
- (n**3n).toString()
- `${n**3n}`
- n**3n + ''
- String(n**3n)
let n = BigInt(require('fs').readFileSync('/dev/stdin').toString())
console.log((n**3n).toString())
console.log(3)
* 이때 n은 bigint, 3은 number, 3n은 bigint 자료형이다.
💫 이 문제를 통해 배운 것
• 일반적인 경우 및 소수점 연산이 필요한 경우 number를, 아주 큰 정수 연산이 필요한 경우 bigint를 사용해야 한다.
• bigint와 number는 함께 연산할 수 없다.
• bigint를 n 없이 출력하는 방법으로는 toString(), 템플릿 리터럴이 가장 일반적이다.