From d4e6a58c4efa66aed7f2f689aaa43fde63ba1252 Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 27 Apr 2025 19:08:43 +0900 Subject: [PATCH 1/4] feat(soobing): group-anagrams --- group-anagrams/soobing.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 group-anagrams/soobing.ts diff --git a/group-anagrams/soobing.ts b/group-anagrams/soobing.ts new file mode 100644 index 000000000..c446e0160 --- /dev/null +++ b/group-anagrams/soobing.ts @@ -0,0 +1,15 @@ +// idea: 배열에 담긴 모든 애들을 다 sorting하면서 sorting된 결과를 key로 바인딩하고 Record 에 맞게 매핑하여 values들만 리턴하면 될것 같음 +function groupAnagrams(strs: string[]): string[][] { + const map = new Map(); + + for (let i = 0; i < strs.length; i++) { + const key = strs[i].split("").sort().join(""); + const group = map.get(key); + if (group) { + group.push(strs[i]); + } else { + map.set(key, [strs[i]]); + } + } + return [...map.values()]; +} From eaa4ecef91cfec9f6dfd2634566a8222f8bbabc0 Mon Sep 17 00:00:00 2001 From: soobing Date: Sun, 27 Apr 2025 22:15:53 +0900 Subject: [PATCH 2/4] feat(soobing): encode-and-decode-strings --- encode-and-decode-strings/soobing.ts | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 encode-and-decode-strings/soobing.ts diff --git a/encode-and-decode-strings/soobing.ts b/encode-and-decode-strings/soobing.ts new file mode 100644 index 000000000..e3b471b12 --- /dev/null +++ b/encode-and-decode-strings/soobing.ts @@ -0,0 +1,34 @@ +class Solution { + /** + * 문자열 배열을 하나의 문자열로 인코딩합니다. + * @param strs - 문자열 배열 + * @returns 인코딩된 하나의 문자열 + */ + encode(strs: string[]): string { + return strs.map((str) => str.length + "#" + str).join(""); + } + + /** + * 인코딩된 문자열을 원래 문자열 배열로 디코딩합니다. + * @param str - 인코딩된 문자열 + * @returns 디코딩된 문자열 배열 + */ + decode(str: string): string[] { + const result: string[] = []; + + let i = 0; + while (i < str.length) { + let j = i; + while (str[j] !== "#") { + j++; + } + + const length = parseInt(str.slice(i, j)); + const word = str.slice(j + 1, j + 1 + length); + result.push(word); + i = j + 1 + length; + } + + return result; + } +} From 742008bc28a8170378bc8b1df9ead609d5babf23 Mon Sep 17 00:00:00 2001 From: soobing Date: Mon, 28 Apr 2025 23:11:58 +0900 Subject: [PATCH 3/4] feat(soobing): word-break --- word-break/soobing.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 word-break/soobing.ts diff --git a/word-break/soobing.ts b/word-break/soobing.ts new file mode 100644 index 000000000..a6ed58306 --- /dev/null +++ b/word-break/soobing.ts @@ -0,0 +1,15 @@ +function wordBreak(s: string, wordDict: string[]): boolean { + const dp = new Array(s.length + 1).fill(false); + dp[s.length] = true; + + for (let i = s.length - 1; i >= 0; i--) { + for (const word of wordDict) { + if (i + word.length <= s.length && s.slice(i, i + word.length) === word) { + dp[i] = dp[i + word.length]; + } + + if (dp[i]) break; + } + } + return dp[0]; +} From 980e6108b328dbf755cb0a9e3b4e128dc2eceea1 Mon Sep 17 00:00:00 2001 From: soobing Date: Sat, 3 May 2025 22:55:07 +0900 Subject: [PATCH 4/4] feat(soobing): implement-trie-prefix-tree --- implement-trie-prefix-tree/soobing.ts | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 implement-trie-prefix-tree/soobing.ts diff --git a/implement-trie-prefix-tree/soobing.ts b/implement-trie-prefix-tree/soobing.ts new file mode 100644 index 000000000..d6a9e5935 --- /dev/null +++ b/implement-trie-prefix-tree/soobing.ts @@ -0,0 +1,46 @@ +class TrieNode { + children: Map; + isEnd: boolean; + + constructor() { + this.children = new Map(); + this.isEnd = false; + } +} + +class Trie { + root: TrieNode; + + constructor() { + this.root = new TrieNode(); + } + + insert(word: string): void { + let node = this.root; + for (const char of word) { + if (!node.children.has(char)) { + node.children.set(char, new TrieNode()); + } + node = node.children.get(char)!; + } + node.isEnd = true; + } + + search(word: string): boolean { + const node = this._findNode(word); + return node !== null && node.isEnd; + } + + startsWith(prefix: string): boolean { + return this._findNode(prefix) !== null; + } + + private _findNode(word: string): TrieNode | null { + let node = this.root; + for (const char of word) { + if (!node.children.has(char)) return null; + node = node.children.get(char)!; + } + return node; + } +}