❓ 문제
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진수 a
와 b
를 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
'알고리즘 > leetCode' 카테고리의 다른 글
[leetCode] 136. Single Number (Easy) 풀이 (0) | 2022.08.17 |
---|---|
[leetCode] 69. Sqrt(x) (Easy) 풀이 (0) | 2022.07.25 |
[leetCode] 66. Plus One (Easy) 풀이 (0) | 2022.07.14 |
[leetCode] 58. Length of Last Word (Easy) 풀이 (0) | 2022.07.13 |
[leetCode] 35. Search Insert Position (Easy) 풀이 (0) | 2022.07.12 |