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; + } +} 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()]; +} 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; + } +} 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]; +}