From bcda32e748db7d973fdf924c511657189ce4625a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Mon, 17 Nov 2025 16:26:25 +0900 Subject: [PATCH 1/6] feat: solve valid-anagram --- valid-anagram/sujeong-dev.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 valid-anagram/sujeong-dev.js diff --git a/valid-anagram/sujeong-dev.js b/valid-anagram/sujeong-dev.js new file mode 100644 index 0000000000..778a5e7b86 --- /dev/null +++ b/valid-anagram/sujeong-dev.js @@ -0,0 +1,20 @@ +/** + * @param {string} s + * @param {string} t + * @return {boolean} + */ +var isAnagram = function (s, t) { + const frequencyMap = new Map(); + + for (const x of s) { + frequencyMap.set(x, (frequencyMap.get(x) || 0) + 1); + } + + for (const y of t) { + if (!frequencyMap.has(y)) return false; + frequencyMap.set(y, frequencyMap.get(y) - 1); + if (frequencyMap.get(y) === 0) frequencyMap.delete(y); + } + + return frequencyMap.size === 0; +}; From 386e0ac3d0cee29b364dda4cfd468f2a78068dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Mon, 17 Nov 2025 17:11:31 +0900 Subject: [PATCH 2/6] feat: solve climbing-stairs --- climbing-stairs/sujeong-dev.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 climbing-stairs/sujeong-dev.js diff --git a/climbing-stairs/sujeong-dev.js b/climbing-stairs/sujeong-dev.js new file mode 100644 index 0000000000..22a70885af --- /dev/null +++ b/climbing-stairs/sujeong-dev.js @@ -0,0 +1,14 @@ +/** + * @param {number} n + * @return {number} + */ + +var climbStairs = function (n, memo = []) { + if (memo[n] !== undefined) return memo[n]; + + if (n <= 1) return 1; + + memo[n] = climbStairs(n - 1, memo) + climbStairs(n - 2, memo); + + return memo[n]; +}; From f032c1daf5c50951b65fd89d1f8aced6f572cd6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Sat, 22 Nov 2025 14:29:02 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20early=20return=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- valid-anagram/sujeong-dev.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/valid-anagram/sujeong-dev.js b/valid-anagram/sujeong-dev.js index 778a5e7b86..21c0942042 100644 --- a/valid-anagram/sujeong-dev.js +++ b/valid-anagram/sujeong-dev.js @@ -4,6 +4,8 @@ * @return {boolean} */ var isAnagram = function (s, t) { + if (s.length !== t.length) return false; + const frequencyMap = new Map(); for (const x of s) { From 4953d89d6b268a83b7263004d1dbf78444d8f4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Sat, 22 Nov 2025 14:41:00 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20easy=20=EB=B3=B5=EC=9E=A1=EB=8F=84?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=20=EC=A3=BC=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- climbing-stairs/sujeong-dev.js | 8 +++++++- valid-anagram/sujeong-dev.js | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/climbing-stairs/sujeong-dev.js b/climbing-stairs/sujeong-dev.js index 22a70885af..450653afbe 100644 --- a/climbing-stairs/sujeong-dev.js +++ b/climbing-stairs/sujeong-dev.js @@ -1,7 +1,13 @@ /** * @param {number} n * @return {number} - */ + * + * 시간복잡도 계산 + * 메모이제이션으로 n번째에는 n번째에 대한 부분만 연산되므로 O(n) + * + * 공간복잡도 계산 + * memo배열에 n번째 연산값들이 각 인덱스에 할당되므로 O(n) +d */ var climbStairs = function (n, memo = []) { if (memo[n] !== undefined) return memo[n]; diff --git a/valid-anagram/sujeong-dev.js b/valid-anagram/sujeong-dev.js index 21c0942042..66f434b53a 100644 --- a/valid-anagram/sujeong-dev.js +++ b/valid-anagram/sujeong-dev.js @@ -2,10 +2,18 @@ * @param {string} s * @param {string} t * @return {boolean} + * + * 시간복잡도 계산 + * 문자열 s 길이만큼 Map에 set => n + * 문자열 t 길이만큼 Map에 set => n + * 따라서 O(n) + * + * 공간복잡도 계산 + * 문자열 s, t의 길이만큼 Map에 할당되니까 O(n) */ var isAnagram = function (s, t) { if (s.length !== t.length) return false; - + const frequencyMap = new Map(); for (const x of s) { From c4874998f446eb2b1457f998a2051c846396a998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Sat, 22 Nov 2025 16:56:14 +0900 Subject: [PATCH 5/6] feat: solve array except self --- product-of-array-except-self/sujeong-dev.js | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 product-of-array-except-self/sujeong-dev.js diff --git a/product-of-array-except-self/sujeong-dev.js b/product-of-array-except-self/sujeong-dev.js new file mode 100644 index 0000000000..d961d6ed9b --- /dev/null +++ b/product-of-array-except-self/sujeong-dev.js @@ -0,0 +1,48 @@ +/** + * @param {number[]} nums + * @return {number[]} + + result[i] = (nums[0] * ... * nums[i-1]) * (nums[i+1] * nums[n-1]) + i=0 r[0]= 1 + i=1 r[1]= 1 * nums[0] = 1 + i=2 r[2]= 1 * nums[0] * nums[1] = 2 + i=3 r[3]= 1 * nums[0] * nums[1] * nums[2] = 6 + + i=0 r[0]=24 + i=1 r[1]= 1 * nums[3] * nums[2] = 12 + r=2 r[2]= 1 * nums[3] =4 + r=3 r[3]= 1 + + i=0 r[0]=1 * 24 + i=1 r[1]=1 * 12 + i=2 r[2]=2 * 4 + i=3 r[3]=6 * 1 + 인덱스를 중심으로 왼쪽 구간 원소의 곱 * 오른쪽 구간 원소의 곱 + + 시간복잡도 계산 + 왼쪽 구간 for문 nums에 비례해서 연산 + 오른쪽 구간 for문 nums에 비례해서 연산 + => O(n) + + 공간복잡도 계산 + start, end 할당(출력공간인 resultArray배열은 추가공간에서 제외된다.) + => O(1) + */ +var productExceptSelf = function (nums) { + let resultArray = Array(nums.length).fill(1); + const n = nums.length; + + let start = 1; + for (let i = 1; i < n; i++) { + start *= nums[i - 1]; + resultArray[i] = start; + } + + let end = 1; + for (let i = n - 2; i >= 0; i--) { + end *= nums[i + 1]; + resultArray[i] *= end; + } + + return resultArray; +}; From e52f5f9e55be6eb45ec2263d48c248ac5cbc3532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B5=AC=EC=88=98=EC=A0=95?= <9sujeong.dev@gmail.com> Date: Sat, 22 Nov 2025 19:12:44 +0900 Subject: [PATCH 6/6] feat: solve 3sum --- 3sum/sujeong-dev.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 3sum/sujeong-dev.js diff --git a/3sum/sujeong-dev.js b/3sum/sujeong-dev.js new file mode 100644 index 0000000000..cb64b35dbc --- /dev/null +++ b/3sum/sujeong-dev.js @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number[][]} + * + * 시간복잡도: 이중 for문으로 O(n^2)이긴한데 너무 오래걸림 + * 해설 확인해보기 + */ +var threeSum = function (nums) { + if (nums.every((num) => num === 0)) return [nums.slice(0, 3)]; + + const threeSet = new Set(); + for (let i = 0; i < nums.length - 2; i++) { + const twoSet = new Set(); + for (let j = i + 1; j < nums.length; j++) { + const findNum = -(nums[i] + nums[j]); + if (twoSet.has(findNum)) { + const triplet = [nums[i], nums[j], findNum].sort((a, b) => a - b); + threeSet.add(triplet.join(',')); + } + twoSet.add(nums[j]); + } + } + return Array.from(threeSet, (k) => k.split(',').map(Number)); +};