Skip to content

Commit 5a7828b

Browse files
authored
Merge pull request #967 from mmyeon/main
[mallayon] Week 8
2 parents d23f613 + 95e49af commit 5a7828b

File tree

5 files changed

+185
-0
lines changed

5 files changed

+185
-0
lines changed

โ€Žclone-graph/mmyeon.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class _Node {
2+
val: number;
3+
neighbors: _Node[];
4+
constructor(val?: number, neighbors?: _Node[]) {
5+
this.val = val === undefined ? 0 : val;
6+
this.neighbors = neighbors === undefined ? [] : neighbors;
7+
}
8+
}
9+
10+
/**
11+
* @link https://leetcode.com/problems/clone-graph/description/
12+
*
13+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
14+
* - ์—ฃ์ง€ ์ผ€์ด์Šค : ์ฃผ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ null์ด๋ฉด ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด
15+
* - ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ : ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ, ์ €์žฅ๋œ ๋ณต์‚ฌ ๋…ธ๋“œ ๋ฆฌํ„ดํ•ด์„œ ์ค‘๋ณต ์ƒ์„ฑ ๋ฐฉ์ง€
16+
* - ์ƒˆ๋กœ์šด ๋…ธ๋“œ ํด๋ก ํ•˜๊ณ  visited ๋งต์— ์ €์žฅ
17+
* - ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ด์›ƒ ๋…ธ๋“œ๋„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ณต์ œ
18+
* - ํด๋ก ๋œ ๋…ธ๋“œ ๋ฆฌํ„ด
19+
*
20+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n + e)
21+
* - n์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, e๋Š” ๋…ธ๋“œ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฃ์ง€์˜ ๊ฐœ์ˆ˜
22+
* - ๋ชจ๋“  ๋…ธ๋“œ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋…ธ๋“œ์˜ ์ด์›ƒ ํƒ์ƒ‰
23+
*
24+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
25+
* - ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํด๋ก ํ•ด์„œ visited ๋งต์— ์ €์žฅ๋˜๋ฏ€๋กœ O(n)
26+
* - ๊ทธ๋ž˜ํ”„๊ฐ€ ์„ ํ˜• ๊ตฌ์กฐ์ธ ์ตœ์•…์˜ ๊ฒฝ์šฐ, ์žฌ๊ท€ ํ˜ธ์ถœ ์Šคํƒ์ด O(n)
27+
*/
28+
function cloneGraph(node: _Node | null): _Node | null {
29+
if (!node) return null;
30+
const visited = new Map<number, _Node>();
31+
32+
const cloneNode = (node: _Node): _Node => {
33+
if (visited.has(node.val)) return visited.get(node.val) as _Node;
34+
35+
const clonedNode = new _Node(node.val);
36+
visited.set(node.val, clonedNode);
37+
38+
for (const neighbor of node.neighbors) {
39+
const clonedNeighbor = cloneNode(neighbor);
40+
41+
clonedNode.neighbors.push(clonedNeighbor);
42+
}
43+
44+
return clonedNode;
45+
};
46+
47+
return cloneNode(node);
48+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* @link https://leetcode.com/problems/longest-common-subsequence/description/
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
5+
* - LCS ๊ธธ์ด ๋‹ด์„ DP ๋ฐฐ์—ด ์„ ์–ธ
6+
* - ๋ฌธ์ž ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ™์€ ๋ฌธ์ž์ธ ๊ฒฝ์šฐ, ์ด์ „ ๊ฐ’ + 1 ๋กœ ์—…๋ฐ์ดํŠธ
7+
* - ๋ฌธ์ž ๋‹ค๋ฅธ ๊ฒฝ์šฐ, ์ด์ „ ๊ฐ’ ๊ทธ๋Œ€๋กœ ์œ ์ง€
8+
*
9+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(m * n)
10+
* - ๋‘ ๋ฌธ์ž์—ด ๊ธธ์ด ํฌ๊ธฐ๋งŒํผ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰
11+
*
12+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(m * n)
13+
* - ๋‘ ๋ฌธ์ž ๊ธธ์ด ํฌ๊ธฐ๋งŒํผ DP ๋ฐฐ์—ด์— ์ €์žฅ
14+
*/
15+
function longestCommonSubsequence(text1: string, text2: string): number {
16+
const m = text1.length,
17+
n = text2.length;
18+
19+
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
20+
21+
for (let i = 1; i <= m; i++) {
22+
for (let j = 1; j <= n; j++) {
23+
if (text1[i - 1] === text2[j - 1]) {
24+
dp[i][j] = dp[i - 1][j - 1] + 1;
25+
} else {
26+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
27+
}
28+
}
29+
}
30+
return dp[m][n];
31+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* @link https://leetcode.com/problems/longest-repeating-character-replacement/
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
5+
* - ๋ฌธ์ž์—ด ์ˆœํšŒํ•˜๋ฉด์„œ, ํ˜„์žฌ ์œˆ๋„์šฐ ๋‚ด ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜ ์ €์žฅ
6+
* - ์œˆ๋„์šฐ ์ถ•์†Œ ์กฐ๊ฑด : ์œˆ๋„์šฐ ํฌ๊ธฐ - ์œˆ๋„์šฐ ๋‚ด ์ตœ๋‹ค ๋“ฑ์žฅ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜ > k
7+
* => k๋ณด๋‹ค ๋‹ค๋ฅธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, left ํฌ์ธํ„ฐ ์ด๋™ํ•ด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ ์ค„์ด๊ธฐ
8+
* - ์œˆ๋„์šฐ ํฌ๊ธฐ ์กฐ์ ˆํ•˜๋ฉด์„œ ์ตœ๋Œ€ ๊ธธ์ด ์—…๋ฐ์ดํŠธ
9+
*
10+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
11+
* - ๋ฌธ์ž n๊ฐœ๋งŒํผ 1ํšŒ ์ˆœํšŒํ•˜๋ฉด์„œ ์œˆ๋„์šฐ ํฌ๊ธฐ ์กฐ์ ˆ
12+
*
13+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
14+
* - ๋Œ€๋ฌธ์ž์˜ ๊ฐœ์ˆ˜(26๊ฐœ)๋งŒํผ map์— ์ €์žฅ
15+
*/
16+
function characterReplacement(s: string, k: number): number {
17+
const map = new Map<string, number>();
18+
let maxFrequency = 0,
19+
maxLength = 0,
20+
left = 0;
21+
22+
for (let right = 0; right < s.length; right++) {
23+
const rightPositionChar = s[right];
24+
// ๋ฌธ์ž์˜ ๋นˆ๋„์ˆ˜ map์— ์ €์žฅ
25+
map.set(rightPositionChar, (map.get(rightPositionChar) ?? 0) + 1);
26+
maxFrequency = Math.max(maxFrequency, map.get(rightPositionChar)!);
27+
28+
// ์œˆ๋„์šฐ ์ถ•์†Œํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ - k๋ณด๋‹ค ๋‹ค๋ฅธ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
29+
if (right - left + 1 - maxFrequency > k) {
30+
map.set(s[left], map.get(s[left])! - 1);
31+
left++;
32+
}
33+
34+
// ์ตœ๋Œ€ ๊ธธ์ด ์—…๋ฐ์ดํŠธ
35+
maxLength = Math.max(maxLength, right - left + 1);
36+
}
37+
38+
return maxLength;
39+
}

โ€Žnumber-of-1-bits/mmyeon.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* @link https://leetcode.com/problems/number-of-1-bits/description/
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
5+
* - n์„ 2๋กœ ๋‚˜๋ˆ„๋ฉด์„œ ๋‚˜๋จธ์ง€๊ฐ€ 1์ธ ๊ฒฝ์šฐ ์นด์šดํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
6+
*
7+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(logn)
8+
* - ์ˆซ์ž์˜ ๋น„ํŠธ ๊ธธ์ด๋งŒํผ ๋ฐ˜๋ณต
9+
*
10+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
11+
* - ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
12+
*/
13+
function hammingWeight(n: number): number {
14+
let bitCount = 0;
15+
while (n >= 1) {
16+
bitCount += n % 2;
17+
18+
n = Math.floor(n / 2);
19+
}
20+
21+
return bitCount;
22+
}
23+
24+
/**
25+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• : ๋น„ํŠธ ์—ฐ์‚ฐ์ž ํ™œ์šฉ
26+
* - n & 1 : n์˜ ๋งˆ์ง€๋ง‰ ๋น„ํŠธ๊ฐ€ 1์ธ์ง€ ํ™•์ธํ•˜์—ฌ bitCount ์—…๋ฐ์ดํŠธ
27+
* - n >>>= 1 : ์˜ค๋ฅธ์ชฝ ์‹œํ”„ํŠธ๋กœ n์„ 1๋น„ํŠธ์”ฉ ์ด๋™
28+
*/
29+
function hammingWeight(n: number): number {
30+
let bitCount = 0;
31+
while (n >= 1) {
32+
bitCount += n & 1;
33+
34+
n >>>= 1;
35+
}
36+
37+
return bitCount;
38+
}

โ€Žsum-of-two-integers/mmyeon.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
*@link https://leetcode.com/problems/sum-of-two-integers/description/
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
5+
* - ๋น„ํŠธ AND ์—ฐ์‚ฐ์ž(&) ์‚ฌ์šฉํ•ด์„œ ์ž๋ฆฌ ์˜ฌ๋ฆผ์ด ํ•„์š”ํ•œ ๋น„ํŠธ ๊ณ„์‚ฐํ•˜๊ณ  ์™ผ์ชฝ ์‹œํ”„ํŠธ(<<)๋กœ ์ž๋ฆฌ ์˜ฌ๋ฆผ๊ฐ’์„ ๋‹ค์Œ ์ž๋ฆฌ๋กœ ์ด๋™
6+
* - ๋น„ํŠธ XOR ์—ฐ์‚ฐ์ž(^) ์‚ฌ์šฉํ•ด์„œ ์ž๋ฆฌ ์˜ฌ๋ฆผ ์ œ์™ธํ•œ ์ž๋ฆฌํ•ฉ ๊ณ„์‚ฐํ•˜๊ณ  a๊ฐ’ ์—…๋ฐ์ดํŠธ
7+
* - ์ž๋ฆฌ ์˜ฌ๋ฆผ๊ฐ’์ด 0์ด ๋  ๋•Œ๊นŒ์ง€ ์ž๋ฆฌ ์˜ฌ๋ฆผ ๋ฐ˜๋ณต
8+
* - ์ž๋ฆฌ ์˜ฌ๋ฆผ ์—†์œผ๋ฉด ์ตœ์ข…ํ•ฉ์ด ์ €์žฅ๋œ a ๋ฆฌํ„ด
9+
*
10+
*
11+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(k)
12+
* - k๋Š” ์ˆซ์ž์˜ ๋น„ํŠธ ์ˆ˜, ์ตœ๋Œ€ k๋ฒˆ ๋ฐ˜๋ณต
13+
*
14+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
15+
* - ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
16+
*
17+
*/
18+
19+
function getSum(a: number, b: number): number {
20+
while (b) {
21+
// ์ž๋ฆฌ ์˜ฌ๋ฆผ ๊ณ„์‚ฐ
22+
const carry = (a & b) << 1;
23+
// ์ž๋ฆฌํ•ฉ ์—…๋ฐ์ดํŠธ (๊ฐ™์€ ๋น„ํŠธ = 0, ๋‹ค๋ฅธ ๋น„ํŠธ = 1)
24+
a ^= b;
25+
b = carry;
26+
}
27+
28+
return a;
29+
}

0 commit comments

Comments
ย (0)