From aceb3cab2a6d35c109d6dc55dc60663a65ec79ed Mon Sep 17 00:00:00 2001 From: Finn <82873315+uraflower@users.noreply.github.com> Date: Mon, 19 May 2025 22:56:44 +0900 Subject: [PATCH 1/5] [ PS ] : Reverse Bits --- reverse-bits/uraflower.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 reverse-bits/uraflower.js diff --git a/reverse-bits/uraflower.js b/reverse-bits/uraflower.js new file mode 100644 index 000000000..75bf8777a --- /dev/null +++ b/reverse-bits/uraflower.js @@ -0,0 +1,15 @@ +/** + * 주어진 32비트 unsingned integer를 뒤집어 십진수로 반환하는 함수 + * @param {number} n - a positive integer + * @return {number} - a positive integer + */ +const reverseBits = function(n) { + const binary = n.toString(2).padStart(32, '0'); + const reversed = Array.from(binary).reverse().join(''); + const decimal = parseInt(reversed, 2).toString(10); + + return Number(decimal); +}; + +// 시간복잡도: O(1) +// 공간복잡도: O(1) From dbda7187ac28b814334f2fdc9cc05ed75501b73c Mon Sep 17 00:00:00 2001 From: Finn <82873315+uraflower@users.noreply.github.com> Date: Tue, 20 May 2025 22:38:09 +0900 Subject: [PATCH 2/5] [ PS ] : Longest Repeating Character Replacement --- .../uraflower.js | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 longest-repeating-character-replacement/uraflower.js diff --git a/longest-repeating-character-replacement/uraflower.js b/longest-repeating-character-replacement/uraflower.js new file mode 100644 index 000000000..1f094c243 --- /dev/null +++ b/longest-repeating-character-replacement/uraflower.js @@ -0,0 +1,32 @@ +/** + * 주어진 문자열에서 최대 k개를 대체해 가장 긴 동일 문자 반복 부분 문자열을 만들 수 있을 때, + * 이 문자열의 길이를 반환하는 함수 + * @param {string} s + * @param {number} k + * @return {number} + */ + const characterReplacement = function(s, k) { + let start = 0; + let end = 0; + let counter = {}; + let maxFrequent = 0; // 현재 구간에 가장 많이 포함되어 있는 알파벳의 총 개수 + let maxLength = 0; + + while (start <= end && end < s.length) { + counter[s[end]] = (counter[s[end]] || 0) + 1; + maxFrequent = Math.max(maxFrequent, counter[s[end]]); + + while (end - start + 1 - maxFrequent > k) { + counter[s[start]]--; + start++; + } + + maxLength = Math.max(end - start + 1, maxLength); + end++; + } + + return maxLength; +}; + +// 시간복잡도: O(n) +// 공간복잡도: O(1) From 4c42c3e5034a2846cac4cf513b36749c711b34bc Mon Sep 17 00:00:00 2001 From: Finn <82873315+uraflower@users.noreply.github.com> Date: Fri, 23 May 2025 15:00:13 +0900 Subject: [PATCH 3/5] [ PS ] : Clone Graph --- clone-graph/uraflower.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 clone-graph/uraflower.js diff --git a/clone-graph/uraflower.js b/clone-graph/uraflower.js new file mode 100644 index 000000000..d9a6a007e --- /dev/null +++ b/clone-graph/uraflower.js @@ -0,0 +1,31 @@ +// Definition for a _Node. +function _Node(val, neighbors) { + this.val = val === undefined ? 0 : val; + this.neighbors = neighbors === undefined ? [] : neighbors; +}; + +/** + * 그래프를 깊은 복사하여 반환하는 함수 + * @param {_Node} node + * @return {_Node} + */ +const cloneGraph = function (node) { + if (!node) return null; + + function dfs(node, visited) { + const current = new _Node(node.val); + visited.set(node, current); + + node.neighbors.forEach((neighbor) => { + const clonedNeighbor = visited.has(neighbor) ? visited.get(neighbor) : dfs(neighbor, visited); + current.neighbors.push(clonedNeighbor); + }); + + return current; + } + + return dfs(node, new Map()); // visited: 원본 노드를 key, 클론한 노드를 value로 하는 맵 +}; + +// 시간복잡도: O(V + E) (모든 노드와 간선을 한 번씩 순회) +// 공간복잡도: O(V) (visited 맵 + 재귀 호출 스택) From 558ed4eab238c93906323af9a63c2aa634861ce6 Mon Sep 17 00:00:00 2001 From: Finn <82873315+uraflower@users.noreply.github.com> Date: Fri, 23 May 2025 18:34:28 +0900 Subject: [PATCH 4/5] [ PS ] : Palindromic Substrings --- palindromic-substrings/uraflower.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 palindromic-substrings/uraflower.js diff --git a/palindromic-substrings/uraflower.js b/palindromic-substrings/uraflower.js new file mode 100644 index 000000000..330cc13ec --- /dev/null +++ b/palindromic-substrings/uraflower.js @@ -0,0 +1,26 @@ +/** + * 회문인 부분 문자열의 개수를 반환하는 함수 + * @param {string} s + * @return {number} + */ +const countSubstrings = function(s) { + let count = 0; + + for (let i = 0; i Date: Fri, 23 May 2025 19:33:44 +0900 Subject: [PATCH 5/5] [ PS ] : Longest Common Subsequence --- longest-common-subsequence/uraflower.js | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 longest-common-subsequence/uraflower.js diff --git a/longest-common-subsequence/uraflower.js b/longest-common-subsequence/uraflower.js new file mode 100644 index 000000000..b0e5aa347 --- /dev/null +++ b/longest-common-subsequence/uraflower.js @@ -0,0 +1,36 @@ +/** + * 가장 긴 공통 부분 수열의 길이를 반환하는 함수 + * @param {string} text1 + * @param {string} text2 + * @return {number} + */ +const longestCommonSubsequence = function (text1, text2) { + const dp = Array.from({ length: text1.length }, () => Array.from({ length: text2.length }, () => -1)); + + // text1, 2를 순회하는 포인터 i, j를 두고, 두 문자끼리 비교하는 함수 + function dfs(i, j) { + // 포인터가 범위를 넘어가면 백트래킹 + if (i === text1.length || j === text2.length) { + return 0; + } + + // 두 문자를 이미 비교한 적 있는 경우 해당 결과 반환 + if (dp[i][j] !== -1) { + return dp[i][j]; + } + + // 두 문자를 비교 + if (text1[i] === text2[j]) { + dp[i][j] = 1 + dfs(i + 1, j + 1); + } else { + dp[i][j] = Math.max(dfs(i + 1, j), dfs(i, j + 1)); + } + + return dp[i][j]; + } + + return dfs(0, 0); +}; + +// 시간복잡도: O(m * n) (m: text1.length, n: text2.length) +// 공간복잡도: O(m * n) (재귀 호출 깊이: m + n, dp 배열 크기: m * n)