From a3017d102f389db2674ae81428347ffee9f45aff Mon Sep 17 00:00:00 2001 From: "lkh14011424@gmail.com" Date: Wed, 8 Apr 2026 22:24:33 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=8B=9C=EA=B0=84/=EA=B3=B5=EA=B0=84=20?= =?UTF-8?q?=EB=B3=B5=EC=9E=A1=EB=8F=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lkhoony.js | 67 +++++++++++++++++++ .../lkhoony.js | 43 ++++++++++++ graph-valid-tree/lkhoony.js | 38 +++++++++++ 3 files changed, 148 insertions(+) create mode 100644 design-add-and-search-words-data-structure/lkhoony.js create mode 100644 find-minimum-in-rotated-sorted-array/lkhoony.js create mode 100644 graph-valid-tree/lkhoony.js diff --git a/design-add-and-search-words-data-structure/lkhoony.js b/design-add-and-search-words-data-structure/lkhoony.js new file mode 100644 index 0000000000..dfd61f78fb --- /dev/null +++ b/design-add-and-search-words-data-structure/lkhoony.js @@ -0,0 +1,67 @@ +const Node = function() { + this.children = {}; + this.isEnd = false; +} + +var WordDictionary = function() { + this.root = new Node(); +}; + +/** + * @param {string} word + * @return {void} + */ +WordDictionary.prototype.addWord = function(word) { + let currentNode = this.root; + + for (let char of word) { + if (!currentNode.children[char]) { + currentNode.children[char] = new Node(); + } + currentNode = currentNode.children[char]; + } + + currentNode.isEnd = true; +}; + +/** + * @param {string} word + * @return {boolean} + */ +WordDictionary.prototype.search = function(word) { + if (word === undefined) return false; + return this._search(this.root, word, 0); +}; + +WordDictionary.prototype._search = function(node, word, index) { + if (index === word.length) { + return node.isEnd; + } + + const char = word[index]; + + if (char !== '.') { + const child = node.children[char]; + return child ? this._search(child, word, index + 1) : false; + } + + for (const key in node.children) { + if (this._search(node.children[key], word, index + 1)) { + return true; + } + } + + return false; +}; + +/** + * Your WordDictionary object will be instantiated and called as such: + * var obj = new WordDictionary() + * obj.addWord(word) + * var param_2 = obj.search(word) + */ + +// n: 단어수, m: 단어 길이 +// addWord: 시간 복잡도 O(m) +// search: 시간 복잡도 O(m) +// 공간 복잡도 O(n * m) diff --git a/find-minimum-in-rotated-sorted-array/lkhoony.js b/find-minimum-in-rotated-sorted-array/lkhoony.js new file mode 100644 index 0000000000..f55d0da4cd --- /dev/null +++ b/find-minimum-in-rotated-sorted-array/lkhoony.js @@ -0,0 +1,43 @@ +// math의 min을 이용하는 방법 +// tc: O(n^3) +// sc: 잘 몰랐는데 모든 요소를 함수 인자로 풀어 콜스택에 올린다 하여 O(n)이 된다고 함.. +// (대용량의 배열 시 maximum exceed 에러가 날 수 있음) +const findMin_use_math_min = function (nums) { + return Math.min(...nums); +}; + +// 메서드를 사용하지 않은 풀이. +// tc: O(n^3) +// sc: O(1) +const findMin_naive = function (nums) { + let min = nums[0]; + + for (let i = 1; i < nums.length; i++) { + if (nums[i] <= min) { + min = nums[i]; + break; + } + } + + return min; +}; + +// 시간복잡도를 문제의 요구사항에 맞도록 줄여본 풀이 +// tc: O(n*logn) +// sc: O(1) +const findMin = function (nums) { + let left = 0, + right = nums.length - 1; + + while (left < right) { + let mid = Math.floor((left + right) / 2); + + if (nums[mid] > nums[right]) { + left = mid + 1; + } else { + right = mid; + } + } + + return nums[left]; +}; diff --git a/graph-valid-tree/lkhoony.js b/graph-valid-tree/lkhoony.js new file mode 100644 index 0000000000..961953e02b --- /dev/null +++ b/graph-valid-tree/lkhoony.js @@ -0,0 +1,38 @@ +export class Solution { + /** + * @param {number} n - number of nodes + * @param {number[][]} edges - undirected edges + * @return {boolean} + */ + validTree(n, edges) { + if (n === 0) return true; + + // 인접 리스트 생성 + const adj = {}; + for (let i = 0; i < n; i++) { + adj[i] = []; + } + for (const [n1, n2] of edges) { + adj[n1].push(n2); + adj[n2].push(n1); + } + + const visit = new Set(); + + const dfs = (i, prev) => { + if (visit.has(i)) return false; + + visit.add(i); + + for (const j of adj[i]) { + if (j === prev) continue; + if (!dfs(j, i)) return false; + } + + return true; + }; + + return dfs(0, -1) && visit.size === n; + } + } + From b49681cc0fa760002d14e2f50f4de4fb73dbb248 Mon Sep 17 00:00:00 2001 From: "lkh14011424@gmail.com" Date: Wed, 8 Apr 2026 22:53:15 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=8B=9C=EA=B0=84/=EA=B3=B5=EA=B0=84=20?= =?UTF-8?q?=EB=B3=B5=EC=9E=A1=EB=8F=84=20push=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- find-minimum-in-rotated-sorted-array/lkhoony.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/find-minimum-in-rotated-sorted-array/lkhoony.js b/find-minimum-in-rotated-sorted-array/lkhoony.js index f55d0da4cd..c980d6d6c1 100644 --- a/find-minimum-in-rotated-sorted-array/lkhoony.js +++ b/find-minimum-in-rotated-sorted-array/lkhoony.js @@ -1,5 +1,5 @@ // math의 min을 이용하는 방법 -// tc: O(n^3) +// tc: O(n^4) // sc: 잘 몰랐는데 모든 요소를 함수 인자로 풀어 콜스택에 올린다 하여 O(n)이 된다고 함.. // (대용량의 배열 시 maximum exceed 에러가 날 수 있음) const findMin_use_math_min = function (nums) {