Skip to content

Commit 36cb4c3

Browse files
authored
Merge pull request #1057 from mmyeon/main
[mallayon] Week 12
2 parents eed570d + 3a94426 commit 36cb4c3

File tree

4 files changed

+206
-0
lines changed

4 files changed

+206
-0
lines changed
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
*@link https://leetcode.com/problems/non-overlapping-intervals/description/
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
5+
* - ์ตœ์†Œ ์‚ญ์ œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธํ„ฐ๋ฒŒ ์ข…๋ฃŒ ์‹œ์ ์ด ๋น ๋ฅธ ๊ฑธ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
6+
* - ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๊ธฐ ์œ„ํ•ด์„œ ์ด์ „ ์ธํ„ฐ๋ฒŒ ๋ฒ”์œ„์™€ ๋น„๊ต -> ์ด์ „ ์ธํ„ฐ๋ฒŒ ์ข…๋ฃŒ ์ง€์ ๋ณด๋‹ค ์‹œ์ž‘์ ์ด ๋น ๋ฅด๋ฉด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ๊ฒน์น˜๋‹ˆ๊นŒ ์‚ญ์ œ ์นด์šดํŠธ ์ฆ๊ฐ€
7+
* - ๊ฒน์น˜์ง€ ์•Š์„ ๋•Œ๋Š” ์ด์ „ ์ธํ„ฐ๋ฒŒ์„ ํ˜„์žฌ ์ธํ„ฐ๋ฒŒ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ
8+
*
9+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(nlogn)
10+
* - n = intervals์˜ ๊ธธ์ด
11+
* - ์ •๋ ฌํ–ˆ์œผ๋ฏ€๋กœ O(nlogn)
12+
*
13+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
14+
* - ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
15+
*/
16+
function eraseOverlapIntervals(intervals: number[][]): number {
17+
intervals.sort((a, b) => a[1] - b[1]);
18+
19+
let eraseCount = 0,
20+
previousInterval = intervals[0];
21+
22+
for (let i = 1; i < intervals.length; i++) {
23+
const currentInterval = intervals[i];
24+
25+
if (currentInterval[0] < previousInterval[1]) {
26+
eraseCount++;
27+
} else {
28+
previousInterval = intervals[i];
29+
}
30+
}
31+
32+
return eraseCount;
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
*@link https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph
3+
*
4+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• : DFS ์‚ฌ์šฉ
5+
* - ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ
6+
* - DFS ์‚ฌ์šฉํ•ด์„œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
7+
* -๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ๋ฐœ๊ฒฌ ์‹œ count ์ฆ๊ฐ€
8+
*
9+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n + e)
10+
* - n = ๋…ธ๋“œ ๊ฐœ์ˆ˜, e = ์—ฃ์ง€ ๊ฐœ์ˆ˜
11+
* - ๋ชจ๋“  ๋…ธ๋“œ ์ˆœํšŒํ•ด์„œ dfs ์‹คํ–‰ : O(n)
12+
* - edges ์ˆœํšŒํ•ด์„œ graph ์ƒ์„ฑ : O(e)
13+
*
14+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n + e)
15+
* - ๋…ธ๋“œ์™€ ์ธ์ ‘๋œ ๋ฆฌ์ŠคํŠธ ์ €์žฅ : O(n + e)
16+
*/
17+
18+
function countComponents(n: number, edges: number[][]): number {
19+
const graph = new Map<number, number[]>();
20+
21+
for (let i = 0; i < n; i++) {
22+
graph.set(i, []);
23+
}
24+
25+
for (const [node1, node2] of edges) {
26+
graph.get(node1)!.push(node2);
27+
graph.get(node2)!.push(node1);
28+
}
29+
30+
const visited: boolean[] = Array(n).fill(false);
31+
32+
function dfs(node: number) {
33+
// ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ์ฒ˜๋ฆฌ
34+
visited[node] = true;
35+
for (const neighbor of graph.get(node) || []) {
36+
if (!visited[neighbor]) dfs(neighbor);
37+
}
38+
}
39+
40+
let count = 0;
41+
for (let node = 0; node < n; node++) {
42+
// ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
43+
if (!visited[node]) {
44+
count++;
45+
dfs(node);
46+
}
47+
}
48+
49+
return count;
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
class ListNode {
2+
val: number;
3+
next: ListNode | null;
4+
constructor(val?: number, next?: ListNode | null) {
5+
this.val = val === undefined ? 0 : val;
6+
this.next = next === undefined ? null : next;
7+
}
8+
}
9+
10+
/**
11+
*@link https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
12+
*
13+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
14+
* - ๋ฆฌ์ŠคํŠธ ์ˆœํšŒํ•ด์„œ ๋ฆฌ์ŠคํŠธ ์‚ฌ์ด์ฆˆ ์•Œ์•„๋‚ธ ๋’ค, ์•ž์—์„œ๋ถ€ํ„ฐ ๋ช‡ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๊ธฐ
15+
* - ๋ฆฌ์ŠคํŠธ ๋‹ค์‹œ ์ˆœํšŒํ•ด์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋…ธ๋“œ ์ œ๊ฑฐํ•˜๊ธฐ
16+
*
17+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
18+
* - n = ๋ฆฌ์ŠคํŠธ ๊ธธ์ด
19+
* - 1ํšŒ ์ˆœํšŒ -> ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ์•Œ์•„๋‚ด๊ธฐ, ์ถ”๊ฐ€๋กœ 1ํšŒ ์ˆœํšŒํ•ด์„œ ๋…ธ๋“œ ์ œ๊ฑฐ
20+
*
21+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
22+
* - ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
23+
*/
24+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
25+
let listSize = 0;
26+
let current = head;
27+
28+
// ๋ฆฌ์ŠคํŠธ ๊ธธ์ด ๊ตฌํ•˜๊ธฐ
29+
while (current) {
30+
listSize++;
31+
current = current.next;
32+
}
33+
34+
// ์ œ๊ฑฐํ•  ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค
35+
const targetIndex = listSize - n;
36+
let currentIndex = 0;
37+
38+
current = head;
39+
40+
if (targetIndex === 0) return head ? head.next : null;
41+
42+
while (current) {
43+
if (currentIndex === targetIndex - 1 && current.next) {
44+
current.next = current.next.next;
45+
break;
46+
}
47+
currentIndex++;
48+
current = current.next;
49+
}
50+
51+
return head;
52+
}
53+
54+
/**
55+
*
56+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• : two pointer ์‚ฌ์šฉ
57+
* - ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋‹ˆ๊นŒ, dummy ๋…ธ๋“œ ๋งŒ๋“ค์–ด์„œ ํ—ค๋“œ ๋…ธ๋“œ๋กœ ์„ค์ •
58+
* - fast ํฌ์ธํ„ฐ์˜ ์ดˆ๊ธฐ ์œ„์น˜๋ฅผ n+1๋กœ ์„ค์ •ํ•˜๊ธฐ
59+
* - ์ดํ›„์—๋Š” slow ํฌ์ธํ„ฐ์™€ fast ํฌ์ธํ„ฐ ๋ชจ๋‘ 1๊ฐœ์”ฉ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ˆœํšŒ
60+
* - fast ํฌ์ธํ„ฐ๊ฐ€ ๋์— ๋„๋‹ฌํ•˜๋ฉด, slow ํฌ์ธํ„ฐ๋Š” ์‚ญ์ œํ•  ๋…ธ๋“œ ์ด์ „ ๋…ธ๋“œ์— ๋„๋‹ฌ
61+
*
62+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
63+
* - n = ๋ฆฌ์ŠคํŠธ ๊ธธ์ด
64+
* - 1ํšŒ ์ˆœํšŒ๋กœ ์‚ญ์ œํ•  ๋…ธ๋“œ ์•Œ์•„๋‚ด๊ธฐ
65+
*
66+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(1)
67+
* - ๊ณ ์ •๋œ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
68+
*/
69+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
70+
if (head === null) return null;
71+
72+
const dummy = new ListNode();
73+
dummy.next = head;
74+
75+
let slow: ListNode | null = dummy,
76+
fast: ListNode | null = dummy;
77+
78+
// fast ํฌ์ธํŠธ ์œ„์น˜ n+1์œผ๋กœ ์ดˆ๊ธฐ ์„ธํŒ…
79+
for (let i = 0; i <= n; i++) {
80+
fast = fast.next!;
81+
}
82+
83+
while (fast !== null) {
84+
slow = slow.next!;
85+
fast = fast.next;
86+
}
87+
88+
// ๋‹ค์Œ ๋…ธ๋“œ ์‚ญ์ œ
89+
slow.next = slow.next!.next;
90+
91+
return dummy.next;
92+
}

โ€Žsame-tree/mmyeon.ts

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class TreeNode {
2+
val: number;
3+
left: TreeNode | null;
4+
right: TreeNode | null;
5+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
this.val = val === undefined ? 0 : val;
7+
this.left = left === undefined ? null : left;
8+
this.right = right === undefined ? null : right;
9+
}
10+
}
11+
/**
12+
*@link https://leetcode.com/problems/same-tree/description/
13+
*
14+
* ์ ‘๊ทผ ๋ฐฉ๋ฒ• :
15+
* - ๋‘ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๊ฐ™์„ ๋•Œ, ์ขŒ์šฐ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋น„๊ตํ•˜๊ธฐ
16+
*
17+
* ์‹œ๊ฐ„๋ณต์žก๋„ : O(n)
18+
* - n = ํŠธ๋ฆฌ ๋…ธ๋“œ ๊ฐœ์ˆ˜
19+
* - ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋ฐฉ๋ฌธํ•œ๋‹ค.
20+
*
21+
* ๊ณต๊ฐ„๋ณต์žก๋„ : O(n)
22+
* - ์ตœ์•…์˜ ๊ฒฝ์šฐ(๊ธฐ์šธ์–ด์ง„ ํŠธ๋ฆฌ), ํŠธ๋ฆฌ ๋†’์ด๋งŒํผ ์žฌ๊ท€๊ฐ€ ํ˜ธ์ถœ ๋œ๋‹ค.
23+
*/
24+
function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
25+
if (p === null && q === null) return true;
26+
27+
// false ์กฐ๊ฑด : ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ null์ผ ๋•Œ, ๋‘ ๋…ธ๋“œ์˜ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ
28+
if (p === null || q === null || p.val !== q.val) return false;
29+
30+
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
31+
}

0 commit comments

Comments
ย (0)