Skip to content

Commit 753eca4

Browse files
authored
Merge pull request #1492 from HoonDongKang/main
[HoonDongKang] Week 8 solutions
2 parents e191f54 + 1087be0 commit 753eca4

File tree

5 files changed

+255
-0
lines changed

5 files changed

+255
-0
lines changed

clone-graph/HoonDongKang.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* [Problem]: [133] Clone Graph
3+
* (https://leetcode.com/problems/longest-repeating-character-replacement/description/)
4+
*/
5+
6+
// Definition for _Node.
7+
class _Node {
8+
val: number;
9+
neighbors: _Node[];
10+
11+
constructor(val?: number, neighbors?: _Node[]) {
12+
this.val = val === undefined ? 0 : val;
13+
this.neighbors = neighbors === undefined ? [] : neighbors;
14+
}
15+
}
16+
17+
function cloneGraph(node: _Node | null): _Node | null {
18+
//시간복잡도 O(n)
19+
//공간복잡도 O(n)
20+
function dfsFunc(node: _Node | null): _Node | null {
21+
if (!node) return null;
22+
const map = new Map<_Node, _Node>();
23+
24+
function dfs(node: _Node): _Node {
25+
if (map.has(node)) return map.get(node)!;
26+
27+
const copy = new _Node(node.val);
28+
map.set(node, copy);
29+
30+
for (const neighbor of node.neighbors) {
31+
copy.neighbors.push(dfs(neighbor));
32+
}
33+
34+
return copy;
35+
}
36+
37+
return dfs(node);
38+
}
39+
//시간복잡도 O(n)
40+
//공간복잡도 O(n)
41+
function bfsFunc(node: _Node | null): _Node | null {
42+
if (!node) return null;
43+
44+
const map = new Map<_Node, _Node>();
45+
const queue: _Node[] = [];
46+
47+
const clone = new _Node(node.val);
48+
map.set(node, clone);
49+
queue.push(node);
50+
51+
while (queue.length > 0) {
52+
const cur = queue.shift()!;
53+
54+
for (const neighbor of cur.neighbors) {
55+
if (!map.has(neighbor)) {
56+
map.set(neighbor, new _Node(neighbor.val));
57+
queue.push(neighbor);
58+
}
59+
60+
map.get(cur)!.neighbors.push(map.get(neighbor)!);
61+
}
62+
}
63+
return clone;
64+
}
65+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* [Problem]: [1143] Longest Common Subsequence
3+
* (https://leetcode.com/problems/longest-common-subsequence/description/)
4+
*/
5+
function longestCommonSubsequence(text1: string, text2: string): number {
6+
//시간복잡도 O(2^n)
7+
//공간복잡도 O(n)
8+
// Time Limit Exceeded
9+
function dfsFunc(text1: string, text2: string): number {
10+
function dfs(i: number, j: number): number {
11+
if (i === text1.length || j === text2.length) return 0;
12+
13+
if (text1[i] === text2[j]) {
14+
return 1 + dfs(i + 1, j + 1);
15+
} else {
16+
return Math.max(dfs(i, j + 1), dfs(i + 1, j));
17+
}
18+
}
19+
20+
return dfs(0, 0);
21+
}
22+
23+
//시간복잡도 O(n)
24+
//공간복잡도 O(n)
25+
function memoizationFunc(text1: string, text2: string): number {
26+
const memo = new Map<string, number>();
27+
28+
function dfs(i: number, j: number) {
29+
if (i === text1.length || j === text2.length) return 0;
30+
31+
const key = `${i}, ${j}`;
32+
if (memo.has(key)) return memo.get(key)!;
33+
34+
let result = 0;
35+
if (text1[i] === text2[j]) {
36+
result = 1 + dfs(i + 1, j + 1);
37+
} else {
38+
result = Math.max(dfs(i, j + 1), dfs(i + 1, j));
39+
}
40+
41+
memo.set(key, result);
42+
return result;
43+
}
44+
45+
return dfs(0, 0);
46+
}
47+
48+
//시간복잡도 O(n)
49+
//공간복잡도 O(n)
50+
function dpFunc(tex1: string, text2: string): number {
51+
const length1 = text1.length;
52+
const length2 = text2.length;
53+
const dp: number[][] = Array.from({ length: length1 + 1 }, () =>
54+
Array(length2 + 1).fill(0)
55+
);
56+
57+
for (let i = 1; i <= length1; i++) {
58+
for (let j = 1; j <= length2; j++) {
59+
if (text1[i - 1] === text2[j - 1]) {
60+
dp[i][j] = 1 + dp[i - 1][j - 1];
61+
} else {
62+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
63+
}
64+
}
65+
}
66+
67+
return dp[length1][length2];
68+
}
69+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* [Problem]: [424] Longest Repeating Character Replacement
3+
* (https://leetcode.com/problems/longest-repeating-character-replacement/description/)
4+
*/
5+
function characterReplacement(s: string, k: number): number {
6+
//시간복잡도 O(n)
7+
//공간복잡도 O(n)
8+
let left = 0;
9+
let right = 0;
10+
let result = 0;
11+
let map = new Map<string, number>();
12+
13+
while (right < s.length) {
14+
map.set(s[right], (map.get(s[right]) || 0) + 1);
15+
16+
const maxFreq = Math.max(...Array.from(map.values()));
17+
if (right - left + 1 - maxFreq > k) {
18+
map.set(s[left], map.get(s[left])! - 1);
19+
left++;
20+
}
21+
22+
result = Math.max(result, right - left + 1);
23+
right++;
24+
}
25+
26+
return result;
27+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/**
2+
* [Problem]: [647] Palindromic Substrings
3+
* (https://leetcode.com/problems/palindromic-substrings/description/)
4+
*/
5+
6+
function countSubstrings(s: string): number {
7+
//시간복잡도 O(n^3)
8+
//공간복잡도 O(1)
9+
function bruteForceFunc(s: string): number {
10+
let count = 0;
11+
12+
for (let i = 0; i < s.length; i++) {
13+
for (let j = i; j < s.length; j++) {
14+
if (isPanlindrome(i, j)) count++;
15+
}
16+
}
17+
18+
function isPanlindrome(left: number, right: number): boolean {
19+
while (left < right) {
20+
if (s[left] !== s[right]) return false;
21+
left++;
22+
right--;
23+
}
24+
25+
return true;
26+
}
27+
28+
return count;
29+
}
30+
//시간복잡도 O(n^2)
31+
//공간복잡도 O(n^2)
32+
function dpFunc(s: string): number {
33+
const dp = new Map<string, boolean>();
34+
let count = 0;
35+
36+
for (let end = 0; end < s.length; end++) {
37+
for (let start = end; start >= 0; start--) {
38+
const key = `${start},${end}`;
39+
if (start === end) {
40+
dp.set(key, true);
41+
} else if (start + 1 === end) {
42+
dp.set(key, s[start] === s[end]);
43+
} else {
44+
const innerKey = `${start + 1},${end - 1}`;
45+
const isInnerPalindrome = dp.get(innerKey) || false;
46+
dp.set(key, s[start] === s[end] && isInnerPalindrome);
47+
}
48+
49+
if (dp.get(key)) {
50+
count++;
51+
}
52+
}
53+
}
54+
55+
return count;
56+
}
57+
}

reverse-bits/HoonDongKang.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* [Problem]: [190] Reverse Bits
3+
* (https://leetcode.com/problems/reverse-bits/description/)
4+
*/
5+
function reverseBits(n: number): number {
6+
//시간복잡도 O(1)
7+
//공간복잡도 O(1)
8+
function stackFunc(n: number): number {
9+
const stack: number[] = [];
10+
let output = 0;
11+
let scale = 1;
12+
13+
while (stack.length < 32) {
14+
stack.push(n % 2);
15+
n = Math.floor(n / 2);
16+
}
17+
18+
while (stack.length) {
19+
output += stack.pop()! * scale;
20+
scale *= 2;
21+
}
22+
23+
return output;
24+
}
25+
//시간복잡도 O(1)
26+
//공간복잡도 O(1)
27+
function bitFunc(n: number): number {
28+
let result = 0;
29+
for (let i = 0; i < 32; i++) {
30+
result <<= 1;
31+
result |= n & 1;
32+
n >>>= 1;
33+
}
34+
35+
return result >>> 0;
36+
}
37+
}

0 commit comments

Comments
 (0)