문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)
출력
첫째 줄에 A+B를 출력한다.
| 예제입력 | 예제출력 |
| 9223372036854775807 9223372036854775808 | 18446744073709551615 |
❌ 풀이
const input=require('fs').readFileSync('/dev/stdin').toString().split(' ');
let a = input[0].split('').map(x=>Number(x)).reverse();
let b = input[1].split('').map(x=>Number(x)).reverse();
let arr=[];
for(let i=0;i<a.length;i++){
if(a[i]+b[i]>=10){
arr[i]= a[i]+b[i]-10;
a[i+1] +=1;
}else{
arr[i]= a[i]+b[i];
}
}
if(isNaN(arr[arr.length-1])){
arr[arr.length-1]=1;
}
console.log(arr.reverse().join(''));
입력값 숫자의 크기가 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수이기 때문에
다른 방법으로 풀이해야했다.
그래서 우선 입력값을 input[0],[1]을 각 a,b배열에 reverse해서 넣었고
a,b [0]인덱스를 더해가며 10이상일경우 한칸 뒤 인덱스에 +1을 하는 방식으로
a배열의 길이까지 반복했다.
이후 마지막은 인덱스 추가되어 숫자로 인식하는게아닌 NaN이 나오길래
따로 if문을 만들어 isNaN으로 마지막인덱스가 NaN일경우 해당인덱스를 1로 바꾸어주고
다시 배열순서를 뒤집어 join으로 합쳐주는 방식으로 풀어봤는데 틀렸다.
✅ NaN
전역 NaN 속성은 Not-A-Number(숫자가 아님)를 나타냅니다.
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
그래서 다른분들의 풀이를 보니 BigInt를 사용하면 더 큰 정수를 표현 할 수 있었다.
⭕ 다시 풀이
const input=require('fs').readFileSync('/dev/stdin').toString();
let num=input.split(' ').map(x=>BigInt(x));
let sum=num[0]+num[1];
console.log(sum.toString());
입력값을 나누며 Number가 아닌 처음부터 BigInt로 바꾸어 받으면
표현가능한데 이경우 String(num[0]+num[1]) 혹은
sum.toString() 으로 문자열로 바꾸어주지않으면
18446744073711551615n 이 출력되므로 주의.
✅ BigInt
원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있습니다.
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeString = BigInt("9007199254740991");
// ↪ 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// ↪ 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// ↪ 9007199254740991n
BigInt와 Number는 어떤 면에서 비슷하지만 중요한 차이점이 있습니다.
예컨대 BigInt는 내장 Math 객체의 메서드와 함께 사용할 수 없고,
연산에서 Number와 혼합해 사용할 수 없습니다.
따라서 먼저 같은 자료형으로 변환해야 합니다.
그러나, BigInt가 Number로 바뀌면 정확성을 잃을 수 있으니 주의해야 합니다.
❗ 소수점 결과를 포함하는 연산을 BigInt와 사용하면 소수점 이하는 사라집니다.
const expected = 4n / 2n;
// ↪ 2n
const rounded = 5n / 2n;
// ↪ 2.5n이 아니라 2n
❗ BigInt는 Number와 일치하지 않지만 동등합니다.
0n === 0
// ↪ false
0n == 0
// ↪ true
❗ Number와 BigInt는 일반적인 방법으로 비교할 수 있습니다.
1n < 2
// ↪ true
2n > 1
// ↪ true
2 > 2
// ↪ false
2n > 2
// ↪ false
2n >= 2
// ↪ true
-출처
https://www.acmicpc.net/problem/10757
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
'Algorithm > Baekjoon(Node.js)' 카테고리의 다른 글
| [JavaSrcipt] Baekjoon - 1978 : 소수 찾기 (함수중단 return) (0) | 2021.09.28 |
|---|---|
| [JavaSrcipt] Baekjoon - 1011 : Fly me to the Alpha Centauri (0) | 2021.09.27 |
| [JavaSrcipt] Baekjoon - 2839 : 설탕 배달 (0) | 2021.09.25 |
| [JavaSrcipt] Baekjoon - 2775 : 부녀회장이 될테야 (shift) (0) | 2021.09.24 |
| [JavaSrcipt] Baekjoon - 10250 : ACM 호텔 (split(' ').map) (0) | 2021.09.23 |