LeetCode 67

Add Binary

문제 출처

문제

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"
Example 2:

Input: a = "1010", b = "1011"
Output: "10101"


Constraints:

Each string consists only of '0' or '1' characters.
1 <= a.length, b.length <= 10^4
Each string is either "0" or doesn't contain any leading zero.

나의 코드

var addBinary = function (a, b) {
  const answer = [];
  const _a = a.split("").reverse();
  const _b = b.split("").reverse();
  const longer = Math.max(_a.length, _b.length);
  let carrying = 0;

  // console.log(_a, _b)

  for (let i = 0; i < longer; i++) {
    const numA = _a[i] === undefined ? 0 : parseInt(_a[i], 2);
    const numB = _b[i] === undefined ? 0 : parseInt(_b[i], 2);
    const sum = numA + numB + carrying;

    if (sum > 1) carrying = 1;
    else carrying = 0;

    // console.log(numA, numB, sum);

    answer.push((sum % 2).toString(2));
  }

  if (carrying === 1) answer.push("1");

  return answer.reverse().join("");
};

참고 코드

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
  const bigA = BigInt(`0b${a}`);
  const bigB = BigInt(`0b${b}`);

  return (bigA + bigB).toString(2);
};

배운점

  • Numeric Literal 에 대해 알게 되었다. (MDN » )

    Numeric Literal 은 JavaScript 의 Lexical Grammar 의 중 하나이다.

    • 2진법 : 0b 또는 0B 로 기입
    • 8진법 : 0o 또는 0O 로 기입
    • 16진법 : 0x 또는 0X 로 기입

    • Numeric Literal 를 Template Literal 로 생성하는 법
      const x = 111;
      const numericLiteral = `0b${x}`;
      
  • BigInt type 에 대해 알게 되었다. (MDN »)

    BigInt는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 253 - 1보다 큰 정수를 표현할 수 있는 내장 객체이다.

    • 생성법
    const theBiggestInt = 9007199254740991n;
    
    const alsoHuge = BigInt(9007199254740991);
    // ↪ 9007199254740991n
    
    const hugeString = BigInt("9007199254740991");
    // ↪ 9007199254740991n
    
    const hugeHex = BigInt("0x1fffffffffffff");
    // ↪ 9007199254740991n
    
    const hugeBin = BigInt(
      "0b11111111111111111111111111111111111111111111111111111"
    );
    // ↪ 9007199254740991n