diff --git a/combination-sum/sadie100.ts b/combination-sum/sadie100.ts new file mode 100644 index 000000000..97f4afc9e --- /dev/null +++ b/combination-sum/sadie100.ts @@ -0,0 +1,28 @@ +/* +dfs로 각 candidates를 돌면서 target과 같아지는 순간에 result를 반환한다. + +같은 조합이 중복됨을 피하기 위해 candidates를 정렬하고, 각 숫자보다 크거나 같은 candidate만 탐색한다. + +시간복잡도 : O(N^(T/min(c))) - N은 candidates의 수, T는 타겟, c는 candidates. +타겟을 candidates의 최소값으로 나눈 값이 최대 깊이이므로 최악의 경우 해당 횟수만큼 반복해서 배열을 탐색함 +*/ + +function combinationSum(candidates: number[], target: number): number[][] { + candidates.sort((a, b) => a - b) + const result = [] + const search = (idx, nums, sum) => { + if (sum === target) { + result.push(nums) + return + } + for (let i = idx; i < candidates.length; i++) { + const num = candidates[i] + if (sum + num > target) return + search(i, [...nums, num], sum + num) + } + } + + search(0, [], 0) + + return result +} diff --git a/number-of-1-bits/sadie100.ts b/number-of-1-bits/sadie100.ts new file mode 100644 index 000000000..deb1a4af6 --- /dev/null +++ b/number-of-1-bits/sadie100.ts @@ -0,0 +1,14 @@ +/** +n을 이진수 변환하고 1의 개수를 센다 + +시간복잡도 O(N) (N은 숫자 n의 비트 개수) + */ + +function hammingWeight(n: number): number { + const binaryNum = n.toString(2) + let result = 0 + for (let char of binaryNum) { + if (char === '1') result += 1 + } + return result +} diff --git a/valid-palindrome/sadie100.ts b/valid-palindrome/sadie100.ts new file mode 100644 index 000000000..0258a1116 --- /dev/null +++ b/valid-palindrome/sadie100.ts @@ -0,0 +1,23 @@ +/* +s에서 알파벳과 숫자가 아닌 글자를 다 날리고, 스택에 문자를 절반까지 담은 후 절반 이후부터는 꺼내가며 앞뒤 레터가 일치하는지 확인한다 + +시간복잡도 : O(N) (N은 s의 길이) +공간복잡도 : O(N) (스택) +*/ + +function isPalindrome(s: string): boolean { + const newStr = s.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() + const isStrEven = newStr.length % 2 === 0 + const lenHalf = Math.floor(newStr.length / 2) + const stack = [] + for (let i = 0; i < newStr.length; i++) { + if (i < lenHalf) { + stack.push(newStr[i]) + } else { + if (!isStrEven && i === lenHalf) continue + const isSame = newStr[i] === stack.pop() + if (!isSame) return false + } + } + return true +}