From c64c254288e712fef6e9bc51c07b36e9f43cd2d6 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: Thu, 13 Nov 2025 14:42:52 +0900 Subject: [PATCH 1/3] feat: solve two-sum --- two-sum/sujeong-dev.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 two-sum/sujeong-dev.js diff --git a/two-sum/sujeong-dev.js b/two-sum/sujeong-dev.js new file mode 100644 index 0000000000..efa87843e0 --- /dev/null +++ b/two-sum/sujeong-dev.js @@ -0,0 +1,32 @@ +/** + * @param {number[]} nums + * @param {number} target + * @return {number[]} + */ + +// 2중 for문: O(n^2) +var twoSum = function (nums, target) { + for (let i = 0; i < nums.length; i++) { + for (let j = 0; j < nums.length; j++) { + if (i === j) continue; + if (nums[i] + nums[j] === target) return [i, j]; + } + } +}; + +// for loof: O(n) +var twoSum = function (nums, target) { + let result = {}; + + nums.forEach((num, index) => { + result[num] = index; + }); + + for (let i = 0; i < nums.length; i++) { + const findNum = target - nums[i]; + + if (findNum in result && result[findNum] !== i) { + return [i, result[findNum]]; + } + } +}; From 1fca4dfcbc04262c00b0a7933bcf8710ee3e3f0f 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: Thu, 13 Nov 2025 15:29:43 +0900 Subject: [PATCH 2/3] feat: solve contains-duplicate --- contains-duplicate/sujeong-dev.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 contains-duplicate/sujeong-dev.js diff --git a/contains-duplicate/sujeong-dev.js b/contains-duplicate/sujeong-dev.js new file mode 100644 index 0000000000..c310c322a9 --- /dev/null +++ b/contains-duplicate/sujeong-dev.js @@ -0,0 +1,27 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ + +// for loof: O(n) +var containsDuplicate = function (nums) { + let indices = {}; + nums.forEach((num, index) => { + indices[num] = index; + }); + + for (let i = 0; i < nums.length; i++) { + if (nums[i] in indices && indices[nums[i]] !== i) return true; + } + + return false; +}; + +// size 속성: O(1) +var containsDuplicate = function (nums) { + const indices = new Set(nums); + + if (indices.size !== nums.length) return true; + + return false; +}; From 31cffde350cef945c43efc5329456d1b93524a53 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, 15 Nov 2025 18:31:11 +0900 Subject: [PATCH 3/3] feat: solve top-k --- contains-duplicate/sujeong-dev.js | 25 ++++++++++++++++++++--- top-k-frequent-elements/sujeong-dev.js | 28 ++++++++++++++++++++++++++ two-sum/sujeong-dev.js | 26 +++++++++++++++++++++--- 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 top-k-frequent-elements/sujeong-dev.js diff --git a/contains-duplicate/sujeong-dev.js b/contains-duplicate/sujeong-dev.js index c310c322a9..7570d819f8 100644 --- a/contains-duplicate/sujeong-dev.js +++ b/contains-duplicate/sujeong-dev.js @@ -1,9 +1,16 @@ /** * @param {number[]} nums * @return {boolean} + * + * 시간복잡도 계산 + * 입력 크기(n)가 커질 때 연산 횟수가 n에 비례해서 증가 + * => O(n) + * + * 공간복잡도 계산 + * indices가 nums에 비례해서 할당 + * 상수 i 할당 + * => O(n) */ - -// for loof: O(n) var containsDuplicate = function (nums) { let indices = {}; nums.forEach((num, index) => { @@ -17,7 +24,19 @@ var containsDuplicate = function (nums) { return false; }; -// size 속성: O(1) +/** + * @param {number[]} nums + * @return {boolean} + * + * 시간복잡도 계산 + * Set의 size속성은 입력 크기와 관계없이 일정한 시간이 걸림 + * => O(1) + * + * 공간복잡도 계산 + * indices가 nums에 비례해서 할당 + * 상수 i 할당 + * => O(n) + */ var containsDuplicate = function (nums) { const indices = new Set(nums); diff --git a/top-k-frequent-elements/sujeong-dev.js b/top-k-frequent-elements/sujeong-dev.js new file mode 100644 index 0000000000..78d90629f4 --- /dev/null +++ b/top-k-frequent-elements/sujeong-dev.js @@ -0,0 +1,28 @@ +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + * + * 시간복잡도 계산 + * for loop가 O(n) + * reduce가 O(n) + * sort가 O(n log n) + * => O(n log n) + */ +var topKFrequent = function (nums, k) { + let result = []; + for (let i = 0; i < nums.length; i++) { + if (result.find((el) => el.key == nums[i])) continue; + const count = nums.reduce((cnt, el) => cnt + (nums[i] === el), 0); + result.push({ key: nums[i], value: count }); + } + + return result + .sort((a, b) => b.value - a.value) + .slice(0, k) + .map((el) => el.key); +}; + +/** + * Follow up: Your algorithm's time complexity must be better than O(n log n), where n is the array's size. + */ diff --git a/two-sum/sujeong-dev.js b/two-sum/sujeong-dev.js index efa87843e0..1d1de2e490 100644 --- a/two-sum/sujeong-dev.js +++ b/two-sum/sujeong-dev.js @@ -2,9 +2,16 @@ * @param {number[]} nums * @param {number} target * @return {number[]} + * + * 시간복잡도 계산 + * 입력 크기(n)가 커질 때 연산 횟수가 n^2에 비례해서 증가 + * => O(n^2) + * + * 공간복잡도 계산 + * 상수 i 할당 + * 상수 j 할당 + * => o(1) */ - -// 2중 for문: O(n^2) var twoSum = function (nums, target) { for (let i = 0; i < nums.length; i++) { for (let j = 0; j < nums.length; j++) { @@ -14,7 +21,20 @@ var twoSum = function (nums, target) { } }; -// for loof: O(n) +/** + * @param {number[]} nums + * @param {number} target + * @return {number[]} + * + * 시간복잡도 계산 + * 입력 크기(n)가 커질 때 연산 횟수가 n에 비례해서 증가 + * => O(n) + * + * 공간복잡도 계산 + * result가 nums에 비례해서 할당 + * 상수 i, findNum 할당 + * => O(n) + */ var twoSum = function (nums, target) { let result = {};