Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 10757 : 큰 수 A+B (BigInt)

비망노트 2021. 9. 26. 21:15

문제

두 정수 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