Skip to content

Commit 5d4cda7

Browse files
authored
Merge pull request #1497 from soobing/week8
[soobing] WEEK08 Solutions
2 parents e7ef6f9 + 7409de1 commit 5d4cda7

File tree

5 files changed

+203
-0
lines changed

5 files changed

+203
-0
lines changed

โ€Žclone-graph/soobing.ts

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* ๋ฌธ์ œ ์„ค๋ช…
3+
* - ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์™„์ „ ๋ณต์ œํ•˜๋Š” ๋ฌธ์ œ
4+
*
5+
* ์•„์ด๋””์–ด
6+
* 1) ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
7+
* - ๊ทธ๋ž˜ํ”„ ๋ณต์‚ฌ๋Š” ๋„คํŠธ์›Œํฌ ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ bfs ํ˜น์€ dfs๋กœ ํ’€์ดํ•œ๋‹ค.
8+
*/
9+
10+
/**
11+
* Definition for _Node.
12+
* class _Node {
13+
* val: number
14+
* neighbors: _Node[]
15+
*
16+
* constructor(val?: number, neighbors?: _Node[]) {
17+
* this.val = (val===undefined ? 0 : val)
18+
* this.neighbors = (neighbors===undefined ? [] : neighbors)
19+
* }
20+
* }
21+
*
22+
*/
23+
24+
class _Node {
25+
val: number;
26+
neighbors: _Node[];
27+
28+
constructor(val?: number, neighbors?: _Node[]) {
29+
this.val = val === undefined ? 0 : val;
30+
this.neighbors = neighbors === undefined ? [] : neighbors;
31+
}
32+
}
33+
34+
function cloneGraph(node: _Node | null): _Node | null {
35+
if (node === null) return null;
36+
37+
const visited = new Map<_Node, _Node>();
38+
39+
function dfs(cur: _Node): _Node {
40+
if (visited.has(cur)) {
41+
return visited.get(cur)!;
42+
}
43+
44+
const cloned = new _Node(cur.val);
45+
visited.set(cur, cloned);
46+
47+
for (const neighbor of cur.neighbors) {
48+
cloned.neighbors.push(dfs(neighbor));
49+
}
50+
51+
return cloned;
52+
}
53+
54+
return dfs(node);
55+
}
56+
57+
/**
58+
* BFS ํ’€์ด
59+
function cloneGraph(node: _Node | null): _Node | null {
60+
if(!node) return null;
61+
62+
const visited = new Map<_Node, _Node>();
63+
64+
const cloneStart = new _Node(node.val);
65+
visited.set(node, cloneStart);
66+
67+
const queue: _Node[] = [node];
68+
69+
while(queue.length > 0) {
70+
const cur = queue.shift();
71+
const curClone = visited.get(cur);
72+
73+
for(const neighbor of cur.neighbors) {
74+
if(!visited.get(neighbor)) {
75+
visited.set(neighbor, new _Node(neighbor.val));
76+
queue.push(neighbor);
77+
}
78+
79+
curClone.neighbors.push(visited.get(neighbor));
80+
}
81+
}
82+
return cloneStart;
83+
};
84+
*/
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* ๋ฌธ์ œ ์„ค๋ช…
3+
* - ๋‘ ๋ฌธ์ž์—ด์˜ ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜
4+
* - ๋Œ€ํ‘œ์ ์ธ DP ๋ฌธ์ œ
5+
*
6+
* ์•„์ด๋””์–ด
7+
* 1) ๋ธŒ๋ฃจํˆฌํฌ์Šค O(n^2)
8+
* 2) DP O(n^2)
9+
* - dp[i][j]๋ฅผ ๋งŒ๋“ค์–ด์„œ text1[i]์™€ text2[j]๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ dp[i][j] = dp[i-1][j-1] + 1
10+
* - ๋‹ค๋ฅธ ๊ฒฝ์šฐ dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])
11+
*/
12+
13+
function longestCommonSubsequence(text1: string, text2: string): number {
14+
const dp = Array.from({ length: text1.length + 1 }, () =>
15+
Array(text2.length + 1).fill(0)
16+
);
17+
18+
for (let i = 1; i <= text1.length; i++) {
19+
for (let j = 1; j <= text2.length; j++) {
20+
if (text1[i - 1] === text2[j - 1]) {
21+
dp[i][j] = dp[i - 1][j - 1] + 1;
22+
} else {
23+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
24+
}
25+
}
26+
}
27+
return dp[text1.length][text2.length];
28+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* ๋ฌธ์ œ ์„ค๋ช…
3+
* - k๋ฒˆ ๋ฌธ์ž ๋Œ€์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ€์žฅ ๊ธธ๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ž์—ด ์ฐพ๊ธฐ
4+
*
5+
* ์•„์ด๋””์–ด
6+
* 1) Sliding Window ํ™œ์šฉ
7+
* - ํˆฌํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜์—ฌ ํ˜„์žฌ ์œˆ๋„์šฐ ๋‚ด์—์„œ k๋ฒˆ ๋ฌธ์ž ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์ฒดํฌํ•˜๊ณ ,
8+
* ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๋ฉด์„œ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ฐพ๋Š”๋‹ค.
9+
*
10+
* ์‹œ๊ฐ„ ๋ณต์žก๋„
11+
* - O(n)
12+
* - ๋ฌธ์ž์—ด์„ ํ•œ๋ฒˆ ์ˆœํšŒํ•˜๋ฉด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
13+
*
14+
* ๊ณต๊ฐ„ ๋ณต์žก๋„
15+
* - O(1)
16+
*/
17+
18+
function characterReplacement(s: string, k: number): number {
19+
let start = 0;
20+
const map: Record<string, number> = {};
21+
let maxLength = 0;
22+
let maxCount = 0;
23+
for (let end = 0; end < s.length; end++) {
24+
map[s[end]] = (map[s[end]] || 0) + 1;
25+
maxCount = Math.max(maxCount, map[s[end]]);
26+
while (end - start + 1 - maxCount > k) {
27+
map[s[start]]--;
28+
start++;
29+
}
30+
31+
maxLength = Math.max(end - start + 1, maxLength);
32+
}
33+
return maxLength;
34+
}

โ€Žpalindromic-substrings/soobing.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* ๋ฌธ์ œ ์„ค๋ช…
3+
* - ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด s์˜ ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ค‘ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜
4+
*
5+
* ์•„์ด๋””์–ด
6+
* 1) 1. Brute Force O(n^3)
7+
* 2) ํˆฌํฌ์ธํ„ฐ O(n^2)
8+
* - ์ง์ˆ˜, ํ™€์ˆ˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ํƒ์ƒ‰
9+
* - ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ํ•ญ๋ชฉ์„ ์ค‘์‹ฌ์œผ๋กœ ์ขŒ์šฐ๋กœ ํ™•์žฅํ•˜๋ฉฐ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํ™•์ธ
10+
* 3) DP O(n^2)
11+
* - dp[i][j]๋ฅผ ๋งŒ๋“ค์–ด์„œ s[i..j]๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ์ €์žฅ -> ๋‹ค์Œ๋ฒˆ์— ํ•ด๋ณด๊ธฐ
12+
*/
13+
function countSubstrings(s: string): number {
14+
let result = 0;
15+
16+
for (let i = 0; i < s.length; i++) {
17+
let left = i;
18+
let right = i;
19+
20+
while (left >= 0 && right < s.length && s[left] === s[right]) {
21+
result++;
22+
left--;
23+
right++;
24+
}
25+
26+
left = i;
27+
right = i + 1;
28+
while (left >= 0 && right < s.length && s[left] === s[right]) {
29+
result++;
30+
left--;
31+
right++;
32+
}
33+
}
34+
return result;
35+
}

โ€Žreverse-bits/soobing.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
*
3+
* ๋ฌธ์ œ ์„ค๋ช…
4+
* - 32๋น„ํŠธ unsigned ์ •์ˆ˜์˜ ๋น„ํŠธ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์–ด์„œ ๋‹ค์‹œ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ
5+
*
6+
* ์•„์ด๋””์–ด
7+
* - ๋น„ํŠธ ์—ฐ์‚ฐ์„ ์ดํ•ดํ•˜๊ณ , O(1)์•Œ์•„๊ฐ€๋Š”๋ฐ ์˜์˜๋ฅผ ๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Œ.
8+
*
9+
* ๋น„ํŠธ ์—ฐ์‚ฐ
10+
* >>>, >>, <<, &, |
11+
* - signed, unsigned ์—ฐ์‚ฐ
12+
*/
13+
function reverseBits(n: number): number {
14+
let result = 0;
15+
for (let i = 0; i < 32; i++) {
16+
result <<= 1;
17+
result |= n & 1;
18+
n >>>= 1;
19+
}
20+
21+
return result >>> 0;
22+
}

0 commit comments

Comments
ย (0)