백준 A+B 큰 수 더하기 (javascript)

김민아·2023년 2월 27일
0

A+B

26711. A+B | 백준

문제

다국어로 된 문제인데, 폴란드? 언뜻보면 돌려보면 단순한 사칙연산 같지만 큰 수 연산에 대한 문제이다.

문제

이번에는 좀 더 업그레이드된 버전으로, 두 개의 숫자를 더하는 문제이다. 이번에는 숫자가 상당히 크기 때문에, 만약에 이 큰 숫자를 다룰 수 있는 도구가 있었다면 좋을텐데...

입력

  • 표준 입력의 첫 번째 줄에는 최대 5,000 자리인 양의 정수 a가 하나 들어온다.
  • 표준 입력의 두 번째 줄에는 최대 5,000 자리인 양의 정수 b가 하나 들어온다.
  • a와 b는 맨 앞자리에 0이 없이 입력된다.

실패

처음엔 BigInt로 접근해보았지만 테스트 결과는 실패. 5,000자리까지 들어올 수 있기 때문에 BigInt의 범위를 한참(?) 벗어나기 때문이다.

  • Number 원시 값이 안정적으로 나타낼 수 있는 최대치는 2^53 - 1
  • BigInt는 그보다 큰 정수를 표현할 수 있는 내장 객체입니다.
  • BigInt의 범위는 2^63까지인 –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
const path = '/dev/stdin'

const input = require('fs').readFileSync(path).toString().trim().split('\n').map(BigInt)
console.log(input[0] + input[1])

성공

힌트는 a와 b의 맨 앞자리에 0으로 채워지지 않는다는 힌트를 보고 떠올랐다. A, B를 문자열 그대로 자릿수를 동일하게 맛추고 자릿수를 반복하면서 연산을 하고 합친 문자열을 리턴한다.

const path = '/dev/stdin'

const input = require('fs').readFileSync(path).toString().trim().split('\n')
let [A, B] = input

let result =  '';
let carry = 0;

A = A.padStart(B.length, "0");
B = B.padStart(A.length, "0");

for (let i = A.length - 1; i >= 0; i--) {
    const sum = parseInt(A[i]) + parseInt(B[i]) + carry;
    result = sum % 10 + result;
    carry = Math.floor(sum / 10);
}

if (carry > 0) {
    result = carry + result;
}

console.log(result)

출처

0개의 댓글