diff --git a/combination-sum/j2h30728.ts b/combination-sum/j2h30728.ts new file mode 100644 index 000000000..9a4b91f23 --- /dev/null +++ b/combination-sum/j2h30728.ts @@ -0,0 +1,28 @@ +/** + * 시간 복잡도: O(k * n^k) (n: candidates 길이, k: target / min(candidates) 최대 깊이) + * 공간 복잡도: O(k) + */ +function combinationSum(candidates: number[], target: number): number[][] { + const result: number[][] = []; + const current: number[] = []; + + function backtracking(index: number, remain: number) { + if (remain === 0) { + result.push([...current]); + return; + } + + if (remain < 0) { + return; + } + + for (let i = index; i < candidates.length; i++) { + current.push(candidates[i]); + backtracking(i, remain - candidates[i]); + current.pop(); + } + } + + backtracking(0, target); + return result; +} diff --git a/decode-ways/j2h30728.ts b/decode-ways/j2h30728.ts new file mode 100644 index 000000000..29713a5b1 --- /dev/null +++ b/decode-ways/j2h30728.ts @@ -0,0 +1,24 @@ +/** + * 시간 복잡도: O(n) + * 공간 복잡도: O(n) + */ +function numDecodings(s: string): number { + const dp = new Array(s.length + 1).fill(0); + dp[0] = 1; + dp[1] = parseInt(s[0]) === 0 ? 0 : 1; + + for (let i = 2; i <= s.length; i++) { + dp[i] = 0; + + if (parseInt(s[i - 1]) !== 0) { + dp[i] += dp[i - 1]; + } + if ( + parseInt(s.slice(i - 2, i)) <= 26 && + parseInt(s.slice(i - 2, i)) >= 10 + ) { + dp[i] += dp[i - 2]; + } + } + return dp[s.length]; +} diff --git a/maximum-subarray/j2h30728.ts b/maximum-subarray/j2h30728.ts new file mode 100644 index 000000000..b8254b165 --- /dev/null +++ b/maximum-subarray/j2h30728.ts @@ -0,0 +1,28 @@ +/** + * 시간 복잡도: O(n) + * 공간 복잡도: O(n) + */ +function maxSubArray1(nums: number[]): number { + const dp = new Array(nums.length).fill(0); + dp[0] = nums[0]; + + for (let i = 1; i < nums.length; i++) { + dp[i] += Math.max(dp[i - 1] + nums[i], nums[i]); + } + return Math.max(...dp); +} + +/** + * 시간 복잡도: O(n) + * 공간 복잡도: O(1) + */ +function maxSubArray2(nums: number[]): number { + let max = nums[0]; + let current = nums[0]; + + for (let i = 1; i < nums.length; i++) { + current = Math.max(current + nums[i], nums[i]); + max = Math.max(max, current); + } + return max; +} diff --git a/number-of-1-bits/j2h30728.ts b/number-of-1-bits/j2h30728.ts new file mode 100644 index 000000000..c478ddf5a --- /dev/null +++ b/number-of-1-bits/j2h30728.ts @@ -0,0 +1,13 @@ +/** + * 시간 복잡도: O(n) (n: 입력값의 비트 수) + * 공간 복잡도: O(1) + */ +function hammingWeight(n: number): number { + let sum = 0; + + while (n > 0) { + sum += Math.abs(n % 2); + n = Math.floor(n / 2); + } + return (sum += n); +} diff --git a/valid-palindrome/j2h30728.ts b/valid-palindrome/j2h30728.ts new file mode 100644 index 000000000..440b56a6e --- /dev/null +++ b/valid-palindrome/j2h30728.ts @@ -0,0 +1,19 @@ +/** + * 시간 복잡도: O(n) + * 공간 복잡도: O(n) + */ +function isPalindrome(s: string): boolean { + let string = ""; + for (const ch of s) { + if ((ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z")) { + string += ch.toLowerCase(); + } + } + + for (let i = 0; i < string.length / 2; i++) { + if (string[i] !== string[string.length - i - 1]) { + return false; + } + } + return true; +}