diff --git a/number-of-1-bits/solbijae.ts b/number-of-1-bits/solbijae.ts new file mode 100644 index 000000000..082fcc578 --- /dev/null +++ b/number-of-1-bits/solbijae.ts @@ -0,0 +1,31 @@ +function hammingWeight(n: number): number { + // 첫시도: 시간/공간 복잡도 O(log n) + // const toBinary = n.toString(2).split('').map(Number); + // let answer = 0; + + // for (let i=0; i0) { + // if (n%2 === 1) count++; + // n = Math.floor(n/2); + // } + + // return count; + + // 시간, 공간 복잡도는 두번째와 같지만, 비트 연산이 CPU에서 직접 처리되는 저수준 명령어로 수행되어 연산 비용이 낮기 때문에 산술연산보다 더 빠름 + let count = 0; + + while (n > 0) { + count += n & 1; // 마지막 비트가 1이면 count++ + n >>>= 1; // 부호 없는 비트 시프트 + } + + return count; +}; diff --git a/valid-palindrome/solbijae.ts b/valid-palindrome/solbijae.ts new file mode 100644 index 000000000..82b6a61d3 --- /dev/null +++ b/valid-palindrome/solbijae.ts @@ -0,0 +1,26 @@ +function isPalindrome(s: string): boolean { + // 첫 시도: 시간/공간 복잡도 O(n) + // const filtered = s.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); + // if (filtered === filtered.split('').reverse().join('')) return true; + // return false; + + // 두번째 시도: Two Pointer 사용 - 시간 복잡도 O(n), 공간 복잡도 O(1) + let left = 0; + let right = s.length - 1; + + while (left < right) { + while (left < right && !isAlphanumeric(s[left])) left++; + while (left < right && !isAlphanumeric(s[right])) right--; + + if (s[left].toLowerCase() !== s[right].toLowerCase()) return false; + + left++; + right--; + } + + return true; + + function isAlphanumeric(c: string): boolean { + return /^[a-zA-Z0-9]$/.test(c); + } +};