From 209e13cbe1f83bc8cfc3647de6327eb957456a39 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Sun, 30 Mar 2025 16:17:45 +0900 Subject: [PATCH 01/10] feat: contains-duplicate solution --- contains-duplicate/grapefruitgreentealoe.js | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 contains-duplicate/grapefruitgreentealoe.js diff --git a/contains-duplicate/grapefruitgreentealoe.js b/contains-duplicate/grapefruitgreentealoe.js new file mode 100644 index 000000000..b4ce4dbe0 --- /dev/null +++ b/contains-duplicate/grapefruitgreentealoe.js @@ -0,0 +1,26 @@ +/** + * @param {number[]} nums + * @return {boolean} + */ + +/** + * 문제설명: 2개 이상 반복되는 값이 있으면 true, 모두 반복되지 않으면 false. + +제한사항 + 1 <= nums.length <= 10^5 +-109 <= nums[i] <= 109 + */ + +var containsDuplicate = function (nums) { + const numberSet = new Set(); + //시간 복잡도 O(n) + for (i of nums) { + if (!numberSet.has(i)) { + //공간복잡도 O(n) + numberSet.add(i); + } else { + return true; + } + } + return false; +}; From 7f4c26438dd08084a0f249c017346abfdec6b49d Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Wed, 2 Apr 2025 13:02:18 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor:=20for=EB=AC=B8=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=84=A0=EC=96=B8=20=EC=8B=9C=20let=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contains-duplicate/grapefruitgreentealoe.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contains-duplicate/grapefruitgreentealoe.js b/contains-duplicate/grapefruitgreentealoe.js index b4ce4dbe0..2bd26ce0a 100644 --- a/contains-duplicate/grapefruitgreentealoe.js +++ b/contains-duplicate/grapefruitgreentealoe.js @@ -14,7 +14,7 @@ var containsDuplicate = function (nums) { const numberSet = new Set(); //시간 복잡도 O(n) - for (i of nums) { + for (let i of nums) { if (!numberSet.has(i)) { //공간복잡도 O(n) numberSet.add(i); From 385603722a46ce7c6b7fb09dbe5d100c9ed534ab Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:00:49 +0900 Subject: [PATCH 03/10] feat: two-sum solution --- two-sum/grapefruitgreentealoe.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 two-sum/grapefruitgreentealoe.js diff --git a/two-sum/grapefruitgreentealoe.js b/two-sum/grapefruitgreentealoe.js new file mode 100644 index 000000000..eea4a7810 --- /dev/null +++ b/two-sum/grapefruitgreentealoe.js @@ -0,0 +1,24 @@ +/** + * 정수 숫자 배열과 정수 target + * 숫자 합이 target과 같은 두 숫자의 index를 리턴. + * 같은 요소 두번 X. 답은 항상 1개 + * 정렬필요 X + */ + +/** + * @param {number[]} nums + * @param {number} target + * @return {number[]} + */ +var twoSum = function (nums, target) { + //순회. target에서 nums[i]를 뺀 요소를 찾기. + //2중포문. 시간복잡도 O(1)~O(N^2) + for (let i = 0; i < nums.length; i++) { + const subNum = target - nums[i]; // 공간 O(1) + for (let j = i + 1; j < nums.length; j++) { + if (nums[j] == subNum) { + return [i, j]; + } + } + } +}; From 9e20a2f2769a2a4eeb873b2225fa07e03996319c Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:27:40 +0900 Subject: [PATCH 04/10] refactor: two-sum --- two-sum/grapefruitgreentealoe.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/two-sum/grapefruitgreentealoe.js b/two-sum/grapefruitgreentealoe.js index eea4a7810..b663491ed 100644 --- a/two-sum/grapefruitgreentealoe.js +++ b/two-sum/grapefruitgreentealoe.js @@ -22,3 +22,27 @@ var twoSum = function (nums, target) { } } }; + +var twoSum2 = function (nums, target) { + for (let i = 0; i < nums.length; i++) { + //시간복잡도 O(N) + const subNum = target - nums[i]; // 공간 O(1) + if (nums.includes(subNum) && nums.indexOf(subNum) !== i) { + //시간복잡도 O(N). 2중포문과 같은 효과. + return [i, nums.indexOf(subNum)]; + } + } +}; + +//Better answer +var twoSum3 = function (nums, target) { + // map으로 관리하여 indexing 최적화 + const numMap = new Map(); + for (let i = 0; i < nums.length; i++) { + const subNum = target - nums[i]; + if (numMap.has(subNum)) { + return [i, numMap.get(subNum)]; + } + numMap.set(nums[i], i); + } +}; From 9bbc17be96dbe21f924e5ff19bb2d02621c0f2bc Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Wed, 2 Apr 2025 18:47:40 +0900 Subject: [PATCH 05/10] =?UTF-8?q?chore:=20two-sum=20=EC=8B=9C=EA=B0=84,=20?= =?UTF-8?q?=EA=B3=B5=EA=B0=84=EB=B3=B5=EC=9E=A1=EB=8F=84=20=EC=A3=BC?= =?UTF-8?q?=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 --- two-sum/grapefruitgreentealoe.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/two-sum/grapefruitgreentealoe.js b/two-sum/grapefruitgreentealoe.js index b663491ed..cce88588a 100644 --- a/two-sum/grapefruitgreentealoe.js +++ b/two-sum/grapefruitgreentealoe.js @@ -39,10 +39,12 @@ var twoSum3 = function (nums, target) { // map으로 관리하여 indexing 최적화 const numMap = new Map(); for (let i = 0; i < nums.length; i++) { + //시간복잡도 O(N) const subNum = target - nums[i]; if (numMap.has(subNum)) { + //시간복잡도 O(1) return [i, numMap.get(subNum)]; } - numMap.set(nums[i], i); + numMap.set(nums[i], i); // 공간 O(1) } }; From 9905453337c32552eaab13438a258284816d90a9 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Wed, 2 Apr 2025 19:24:20 +0900 Subject: [PATCH 06/10] feat: top-k-frequent-elements solution --- .../grapefruitgreentealoe.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 top-k-frequent-elements/grapefruitgreentealoe.js diff --git a/top-k-frequent-elements/grapefruitgreentealoe.js b/top-k-frequent-elements/grapefruitgreentealoe.js new file mode 100644 index 000000000..e9717af59 --- /dev/null +++ b/top-k-frequent-elements/grapefruitgreentealoe.js @@ -0,0 +1,30 @@ +/** + * 정수 array nums , 정수 k가 있을때, 가장 빈도가 높은 숫자 k개 리턴. 순서상관 X + */ + +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ + +//nums에 대해서 각 요소에 대해 중복되는 횟수를 구한다. 그리고 내림차순으로 k개 리턴한다. + +var topKFrequent = function (nums, k) { + const numsFreqMap = new Map(); // O(1) + + // O(n) 시간 / O(n) 공간 + for (let i = 0; i < nums.length; i++) { + const count = (numsFreqMap.get(nums[i]) ?? 0) + 1; // O(1) + numsFreqMap.set(nums[i], count); // O(1) + } + + const arrFromFreqMap = [...numsFreqMap]; // O(n) 시간 / O(n) 공간 + arrFromFreqMap.sort((a, b) => b[1] - a[1]); // O(n log n) 시간 + + return arrFromFreqMap + .map((x) => x[0]) // O(n) 시간 / O(n) 공간 + .slice(0, k); // O(k) 시간 / O(k) 공간 +}; + +//O(n) + O(n log n) + O(n) + O(k) = O(n log n) From d8a48f51587ba3a3a16e3ad5fc50c7b737eca040 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Fri, 4 Apr 2025 02:42:44 +0900 Subject: [PATCH 07/10] =?UTF-8?q?refactor:=20for=20of=20=EC=97=B0=EC=82=B0?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- top-k-frequent-elements/grapefruitgreentealoe.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/top-k-frequent-elements/grapefruitgreentealoe.js b/top-k-frequent-elements/grapefruitgreentealoe.js index e9717af59..29981ee40 100644 --- a/top-k-frequent-elements/grapefruitgreentealoe.js +++ b/top-k-frequent-elements/grapefruitgreentealoe.js @@ -14,9 +14,8 @@ var topKFrequent = function (nums, k) { const numsFreqMap = new Map(); // O(1) // O(n) 시간 / O(n) 공간 - for (let i = 0; i < nums.length; i++) { - const count = (numsFreqMap.get(nums[i]) ?? 0) + 1; // O(1) - numsFreqMap.set(nums[i], count); // O(1) + for (let num of nums) { + numsFreqMap.set(num, (numsFreqMap.get(num) ?? 0) + 1); } const arrFromFreqMap = [...numsFreqMap]; // O(n) 시간 / O(n) 공간 From 41af5dbad0cb3146c10acdb3c368677519800c92 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:28:09 +0900 Subject: [PATCH 08/10] feat: longest-consectuive-sequence solution --- .../grapefruitgreentealoe.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 longest-consecutive-sequence/grapefruitgreentealoe.js diff --git a/longest-consecutive-sequence/grapefruitgreentealoe.js b/longest-consecutive-sequence/grapefruitgreentealoe.js new file mode 100644 index 000000000..283c24635 --- /dev/null +++ b/longest-consecutive-sequence/grapefruitgreentealoe.js @@ -0,0 +1,27 @@ +/** + * 정수 배열 nums + * 가장 많이 연속되는 요소의 길이 리턴. + * O(n) 시간안에 돌아가는 알고리즘 사용할것. + */ +/** + * @param {number[]} nums + * @return {number} + */ +var longestConsecutive = function (nums) { + const numSet = new Set(nums); + let maxCount = 0; + for (let i of numSet) { //n 번 순회 + // ++ 이전에 연속체크가 되었을 수 있으므로, 이전 숫자가 존재한다면 pass + if (numSet.has(i - 1)) continue; //이미 진행 된 연속체크의 경우 하지 않는다. + //연속이 되는지 확인해서 있으면 1추가. + let length = 0; + while (numSet.has(i + length)) { + //연속이 끊기는 순간 멈추는 반복문. 즉 for문 전체 통틀어 최대 n번 실행. + length++; + } + maxCount = Math.max(length, maxCount); + } + return maxCount; +}; + +//시간복잡도 O(n) + O(n) = O(n) /공간복잡도 O(n) \ No newline at end of file From db96ca42a7975f5483260c93bcd6518b0fcf1e90 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:30:19 +0900 Subject: [PATCH 09/10] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- longest-consecutive-sequence/grapefruitgreentealoe.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/longest-consecutive-sequence/grapefruitgreentealoe.js b/longest-consecutive-sequence/grapefruitgreentealoe.js index 283c24635..7b142a0ee 100644 --- a/longest-consecutive-sequence/grapefruitgreentealoe.js +++ b/longest-consecutive-sequence/grapefruitgreentealoe.js @@ -10,7 +10,8 @@ var longestConsecutive = function (nums) { const numSet = new Set(nums); let maxCount = 0; - for (let i of numSet) { //n 번 순회 + for (let i of numSet) { + //n 번 순회 // ++ 이전에 연속체크가 되었을 수 있으므로, 이전 숫자가 존재한다면 pass if (numSet.has(i - 1)) continue; //이미 진행 된 연속체크의 경우 하지 않는다. //연속이 되는지 확인해서 있으면 1추가. @@ -24,4 +25,6 @@ var longestConsecutive = function (nums) { return maxCount; }; -//시간복잡도 O(n) + O(n) = O(n) /공간복잡도 O(n) \ No newline at end of file +//시간복잡도 O(n) + O(n) = O(n) /공간복잡도 O(n) + +//생각할 지점. 양쪽으로 진행된다면, 시간복잡도 최적화 가능 From 49f3bce2c221f1131ec1054a59e09fd48194efa4 Mon Sep 17 00:00:00 2001 From: grapefruitgreentealoe <76976331+grapefruitgreentealoe@users.noreply.github.com> Date: Sat, 5 Apr 2025 03:40:48 +0900 Subject: [PATCH 10/10] feat: house-robber solution --- house-robber/grapefruitgreentealoe.js | 45 +++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 house-robber/grapefruitgreentealoe.js diff --git a/house-robber/grapefruitgreentealoe.js b/house-robber/grapefruitgreentealoe.js new file mode 100644 index 000000000..fd7148257 --- /dev/null +++ b/house-robber/grapefruitgreentealoe.js @@ -0,0 +1,45 @@ +/** + * 도둑이 각 집에 돈의 양이 있는데, 근접한 집은 연결된 보안 시스템이 있다 + * 두 근접 집이 같은 밤에 강도당하면 경찰에게 연락감 + * 오늘 경찰에게 연락이 가지 않으면서 훔칠 수 있는 최대 돈 리턴 + */ + +/** + * 만약 dfs로 구한다면, 시간복잡도는 2^n이 된다 + */ +/** + * @param {number[]} nums + * @return {number} + */ + +//최대값 즉 최적의 해를 구하는 문제. dp를 활용해보자. +var rob = function (nums) { + //배열 크기가 늘어남에 따라, 작은 배열에 대한 결과를 활용하여 계산하는 아이디어. + const dp = new Array(nums.length + 1); //공간복잡도 O(n) + /** + dp[0] = 0; //하나도 없을떄 + dp[1] = nums[0]; //집이 한곳일때 + dp[2] = Math.max(dp[1], nums[1]); //집이 한곳일때의 dp값과, 현재 순번의 돈 + dp[3] = Math.max(dp[2], dp[1] + nums[2]);// 더하지 않으면 이전 결과값, 더하려면 그 전의 결과값에 더하기 + */ + for (let i = 2; i < dp.length; i++) { + //시간복잡도 O(n) + dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]); + } + return dp[dp.length - 1]; +}; + +var rob2 = function (nums) { + //배열에 저장하지 않고 변수에 바로 담는 방식 + let prev = 0; + let curr = 0; + for (let num of nums) { + //prev는 이전의 curr값으로, curr값은 이전의 prev + num + let tempPrev = prev; + prev = curr; + curr = Math.max(num + tempPrev, curr); + } + return curr; +}; +//공간복잡도를 O(1)로 개선 +