본문 바로가기

❓ 문제

Given two binary strings a and b, return their sum as a binary string.

두 개의 이진 문자열 a와 b가 주어지면 그 합을 이진 문자열로 반환합니다.

Example 1:

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

Example 2:

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

❗ 내 답변

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    const digitA = getDigit(a);
    const digitB = getDigit(b);
    const digitRet = Number(digitA + digitB);

    return getBinary(digitRet)

    function getDigit(str) {
        let result = 0;
        const strArr = str.split('').reverse();
        for (let i = 0; i < strArr.length; i++) {
            result += (Math.pow(2, i) * strArr[i]);
        }
        return result;
    }

    function getBinary(num) {
        const result = [];
        do {
            result.unshift(num % 2);
            num = parseInt(num / 2);
        } while(num > 0)

        return result.join('');
    }
};

처음엔 전달받은 2진수 ab를 10진수로 변환하고, 그 둘을 합한 뒤
다시 2진수로 변환해 반환하도록 구현했다.

 

웬만한건 다 풀리나,
엄청나게 큰 이진수가 제공됐을 때 결과가 과학적 표기법으로 표현되어버려서 올바를 결과가 나오지 못했다.

 

그래서 아래 방법으로 변경해줬다.

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    const aArr = a.split('').reverse();
    const bArr = b.split('').reverse();

    let longger, shorter;
    if (aArr.length > bArr.length) {
        shorter = bArr;
        longger = aArr;
    }
    else {
        shorter = aArr;
        longger = bArr;
    }

    const result = [];
    let carry = 0;
    longger.forEach((bin, i) => {
        if (! shorter[i])
            shorter[i] = 0;
        let num = Number(bin) + Number(shorter[i]) + carry;
        carry = parseInt(num / 2);
        result.unshift(num % 2);
    })

    if (carry > 0)
        result.unshift(carry);

    return result.join('');
};

반복을 돌면서 자리마다 이진수를 서로 더하고,
2 이상이면 2로 나누고 나머지를 결과 배열에 넣고 몫을 다음 자리로 넘겨 더하게 했다.

 

앞 전에 풀었던 방법보다 훨씬 간단했다.
앞에선 너무 꼬아서 생각한듯...

❗ Runtime이 가장 빨랐던 답변과 비교

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    const aBin = `0b${a}`
  const bBin = `0b${b}`
  const sum = BigInt(aBin) + BigInt(bBin)
  return sum.toString(2)
};

보자마자 천재인가? 라고 생각했다ㅋㅋㅋㅋㅋ
0b를 접두어로 붙이면 해당 숫자가 이진수라는 의미이다.

 

💡 참고

  • 2진수: 0b
  • 8진수: 0o
  • 16진수: 0x

접두어가 붙은 문자열을 BigInt() 해주고 더했다.
BigInt()는 원시 값을 큰 정수로 표현해주는 JS 내장 함수이다.
마지막으로 toString(2)로 숫자를 2진수로 변환시켜 리턴해줬다.

❗ Memory 사용이 가장 적었던 답변과 비교

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
     const aBin = `0b${a}`
  const bBin = `0b${b}`
  const sum = BigInt(aBin) + BigInt(bBin)
  return sum.toString(2)
};

위 답변과 동일한 답변이었다. 대박...

💡 개선 방안

JS 내장 함수를 잘 활용하자.
ex) toString(2), BigInt

Seize the day!

Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | 자기계발 | 미라클 모닝 | 일상