From 9e56457caccb1e5f9c6b450be53cb16af36ba3b6 Mon Sep 17 00:00:00 2001 From: Blossssom Date: Mon, 17 Nov 2025 12:58:06 +0900 Subject: [PATCH 1/7] valid-anagram solution --- valid-anagram/Blossssom.ts | 45 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 valid-anagram/Blossssom.ts diff --git a/valid-anagram/Blossssom.ts b/valid-anagram/Blossssom.ts new file mode 100644 index 0000000000..fccbbf2be7 --- /dev/null +++ b/valid-anagram/Blossssom.ts @@ -0,0 +1,45 @@ +/** + * @param s 문자열 1 + * @param t 문자열 2 + * @returns 두 문자열의 나열을 바꿔 동일한 문자열이 나올 수 있는지 반환 + * @description + * - 1. 시간 복잡도: O(n), 공간 복잡도 O(1) + */ + +// function isAnagram(s: string, t: string): boolean { +// if(s.length !== t.length) { +// return false; +// } +// const sMap = new Map(); +// for(let i = 0; i < s.length; i++) { +// sMap.has(s[i]) ? sMap.set(s[i], sMap.get(s[i]) + 1) : sMap.set(s[i], 1); +// sMap.has(t[i]) ? sMap.set(t[i], sMap.get(t[i]) - 1) : sMap.set(t[i], -1); +// } + +// for(const v of sMap.values()) { +// if(v) { +// return false; +// } +// } +// return true; +// } + +function isAnagram(s: string, t: string): boolean { + if (s.length !== t.length) return false; + + const hash: Record = {}; + + for (const letter of s) { + hash[letter] = (hash[letter] || 0) + 1; + } + + for (const letter of t) { + if (hash[letter] > 0) { + hash[letter] = hash[letter] - 1; + } else { + return false; + } + } + + return true; +} From b64fd98e47abf1a1ce9427777601d7fc66a3a907 Mon Sep 17 00:00:00 2001 From: Blossssom Date: Mon, 17 Nov 2025 12:58:29 +0900 Subject: [PATCH 2/7] add description --- valid-anagram/Blossssom.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/valid-anagram/Blossssom.ts b/valid-anagram/Blossssom.ts index fccbbf2be7..93b03cfc4e 100644 --- a/valid-anagram/Blossssom.ts +++ b/valid-anagram/Blossssom.ts @@ -4,6 +4,7 @@ * @returns 두 문자열의 나열을 바꿔 동일한 문자열이 나올 수 있는지 반환 * @description * - 1. 시간 복잡도: O(n), 공간 복잡도 O(1) + * - 2. 시간, 공간 복잡도는 같지만 1번 보다는 빠름 -> 동시처리, */ // function isAnagram(s: string, t: string): boolean { From cb3dbc0f741b3406f4a8ef29d5fa32d6fb927d9c Mon Sep 17 00:00:00 2001 From: Blossssom Date: Tue, 18 Nov 2025 08:56:47 +0900 Subject: [PATCH 3/7] climbing-stairs solution --- climbing-stairs/Blossssom.ts | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 climbing-stairs/Blossssom.ts diff --git a/climbing-stairs/Blossssom.ts b/climbing-stairs/Blossssom.ts new file mode 100644 index 0000000000..4d9e2ac2a5 --- /dev/null +++ b/climbing-stairs/Blossssom.ts @@ -0,0 +1,45 @@ +/** + * 1 or 2 스텝 가능 + * @param n - 꼭대기 + * @returns - 꼭대기 까지 도달할 수 있는 방법 수 + * @description + * - 결국 패턴은 피보나치 + * - 시간 복잡도 O(n) + * - 공간 복잡도 O(1) + */ + +// function climbStairs(n: number): number { +// if (n <= 2) { +// return n; +// } + +// const dp = Array.from({ length: n + 1 }, () => 0); +// dp[1] = 1; +// dp[2] = 2; + +// for (let i = 3; i <= n; i++) { +// dp[i] = dp[i - 1] + dp[i - 2]; +// } +// return dp[n]; +// } + +function climbStairs(n: number): number { + if (n <= 2) { + return n; + } + + let prevTwo = 1; + let prevOne = 2; + + for (let i = 2; i <= n; i++) { + const current = prevTwo + prevOne; + prevTwo = prevOne; + prevOne = current; + } + + return prevOne; +} + +const n = 3; +climbStairs(n); + From ac12f1620dc5751297cedeb5a4e2808f628c7921 Mon Sep 17 00:00:00 2001 From: Blossssom Date: Thu, 20 Nov 2025 09:10:52 +0900 Subject: [PATCH 4/7] product-of-array-except-self solution --- product-of-array-except-self/Blossssom.ts | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 product-of-array-except-self/Blossssom.ts diff --git a/product-of-array-except-self/Blossssom.ts b/product-of-array-except-self/Blossssom.ts new file mode 100644 index 0000000000..12abcb71ee --- /dev/null +++ b/product-of-array-except-self/Blossssom.ts @@ -0,0 +1,34 @@ +/** + * @param nums - 정수 배열 + * @returns - nums[i]를 제외한 요소들의 곱셈 값 배열 + * @description + * - 나누기를 통한 풀이는 막힘 + * - 왼쪽, 오른쪽으로 순회하며 곱을 누적하기 + * - 첫번째 반복 - 처음 값은 자신을 제외한 누적의 전체이므로 1, 이후 부터 누적 + * - 두번째 반복 - 마지막 값 또한 자신을 제외한 첫번째 반복의 누적, 이후 부터 미리 누적한 값과 자신을 곱 + * + * @description + * - 시간 복잡도 O(n) + * - 공간 복잡도 O(n) + * - 해당 방법을 떠올리지 못해 AI의 도움을 받았는데 수학적 사고가 더 필요하다. + */ +function productExceptSelf(nums: number[]): number[] { + let prev = 1; + let next = 1; + const arr: number[] = []; + + for (let i = 0; i < nums.length; i++) { + arr.push(prev); + prev = prev * nums[i]; + } + + for (let j = nums.length - 1; j >= 0; j--) { + arr[j] = arr[j] * next; + next = next * nums[j]; + } + + return arr; +} + +const nums = [1, 2, 3, 4]; +productExceptSelf(nums); From 741936ba89b09588572dd6d12e40970a20b11613 Mon Sep 17 00:00:00 2001 From: Blossssom Date: Thu, 20 Nov 2025 10:39:20 +0900 Subject: [PATCH 5/7] 3sum solution --- 3sum/Blossssom.ts | 49 +++++++++++++++++++++++ product-of-array-except-self/Blossssom.ts | 1 + 2 files changed, 50 insertions(+) create mode 100644 3sum/Blossssom.ts diff --git a/3sum/Blossssom.ts b/3sum/Blossssom.ts new file mode 100644 index 0000000000..7b4b9869b4 --- /dev/null +++ b/3sum/Blossssom.ts @@ -0,0 +1,49 @@ +/** + * @param nums - 정수 배열 + * @returns - 세 요소를 합해 0이 되는 값의 배열 + * @description + * - 투 포인터 방식 + * - 결국 유니크한 조합을 찾으며 중복을 제외하는 방향 + * - 무조건 적인 반복 줄이기가 아닌 효율적 범위 반복을 학습해야함 + * - 시간 복잡도 O(N^2) + * - 공간 복잡도 O(log N) + */ +function threeSum(nums: number[]): number[][] { + const answer: number[][] = []; + nums.sort((a, b) => a - b); + + for (let i = 0; i < nums.length - 2; i++) { + if (i && nums[i] === nums[i - 1]) { + continue; + } + + let left = i + 1; + let right = nums.length - 1; + + while (left < right) { + const sum = nums[i] + nums[left] + nums[right]; + + if (sum === 0) { + answer.push([nums[i], nums[left], nums[right]]); + while (left < right && nums[left] === nums[left + 1]) { + left++; + } + while (left < right && nums[right] === nums[right - 1]) { + right--; + } + left++; + right--; + } else if (sum < 0) { + left++; + } else { + right--; + } + } + } + + return answer; +} + +const nums = [-1, 0, 1, 2, -1, -4]; +threeSum(nums); + diff --git a/product-of-array-except-self/Blossssom.ts b/product-of-array-except-self/Blossssom.ts index 12abcb71ee..bd60b82b89 100644 --- a/product-of-array-except-self/Blossssom.ts +++ b/product-of-array-except-self/Blossssom.ts @@ -32,3 +32,4 @@ function productExceptSelf(nums: number[]): number[] { const nums = [1, 2, 3, 4]; productExceptSelf(nums); + From a2d6ba3cd22c08e49ce5741e7b5987e5abd5dcfe Mon Sep 17 00:00:00 2001 From: Blossssom Date: Sat, 22 Nov 2025 17:38:33 +0900 Subject: [PATCH 6/7] add empty line in valid-anagram --- valid-anagram/Blossssom.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/valid-anagram/Blossssom.ts b/valid-anagram/Blossssom.ts index 93b03cfc4e..8e4502fb7e 100644 --- a/valid-anagram/Blossssom.ts +++ b/valid-anagram/Blossssom.ts @@ -44,3 +44,4 @@ function isAnagram(s: string, t: string): boolean { return true; } + From cd23f6a77e4d5cffaa6e6d4f06fccd2d0bac46af Mon Sep 17 00:00:00 2001 From: Blossssom Date: Sat, 22 Nov 2025 17:40:07 +0900 Subject: [PATCH 7/7] add empty line in product-of-addray-except-self --- product-of-array-except-self/Blossssom.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/product-of-array-except-self/Blossssom.ts b/product-of-array-except-self/Blossssom.ts index bd60b82b89..9b40348dc8 100644 --- a/product-of-array-except-self/Blossssom.ts +++ b/product-of-array-except-self/Blossssom.ts @@ -33,3 +33,4 @@ function productExceptSelf(nums: number[]): number[] { const nums = [1, 2, 3, 4]; productExceptSelf(nums); +