Solution 1 (실패)
const input = require('fs').readFileSync('dev/stdin').toString().trim().split(' ').map(Number);
console.log(input.reduce((a + b) => a + b);
문제보고 너무 쉽다고 생각했는데 역시 쉽다고 생각하면 항상 시간초과나 오답처리가 된다. 역시나 이번 문제도 그랬다.
input 을 출력해보면 입력값과 상이하게 출력되는 것을 확인할 수 있다.
9223372036854776000 9223372036854776000
자바스크립트의 숫자타입에도 한계가 있어 정밀하게 출력되기 않는다.
Number
타입이 아닌 BigInt
타입을 사용해야한다. BigInt 는 큰 숫자까지 정밀도있게 표현할 수 있는 타입이다.
BigInt
는Number
원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.
BigInt
와Number
는 어떤 면에서 비슷하지만 중요한 차이점이 있습니다. 예컨대BigInt
는 내장Math
객체의 메서드와 함께 사용할 수 없고, 연산에서Number
와 혼합해 사용할 수 없습니다. 따라서 먼저 같은 자료형으로 변환해야 합니다. 그러나,BigInt
가Number
로 바뀌면 정확성을 잃을 수 있으니 주의해야 합니다.
BigInt 타입을 출력할 땐 문자열로 변환해주어야 숫자 마지막의 n이 함께 출력되지 않는다.
Solution 1 (성공)
const fs = require('fs');
const [a, b] = fs.readFileSync('../input.txt').toString().trim().split(' ').map(BigInt);
console.log((a + b).toString());