Skip to content

Commit 0c3ddd9

Browse files
authored
Merge pull request #1069 from mmyeon/main
[mallayon] Week 13
2 parents cb05274 + fd523be commit 0c3ddd9

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

insert-interval/mmyeon.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
*@link https://leetcode.com/problems/insert-interval/description/
3+
*
4+
* 접근 방법 :
5+
* - 새로운 interval을 기존 interval에 추가하고, 시작 지점 기준으로 오름차순 정렬
6+
* - 현재 interval이 result의 마지막 interval과 겹치는 경우, 종료 지점 업데이트해서 병함
7+
* - 겹치지 않으면, result 배열에 현재 interval 추가
8+
*
9+
* 시간복잡도 : O(nlogn)
10+
* - n = intervals 개수
11+
* - 오름차순으로 정렬
12+
*
13+
* 공간복잡도 : O(n)
14+
* - n = 병합 후 result 배열에 담긴 인터벌의 개수
15+
*/
16+
function insert(intervals: number[][], newInterval: number[]): number[][] {
17+
const sortedIntervals = [...intervals, newInterval].sort(
18+
(a, b) => a[0] - b[0]
19+
);
20+
const result: number[][] = [sortedIntervals[0]];
21+
22+
for (let i = 1; i < sortedIntervals.length; i++) {
23+
const lastInterval = result[result.length - 1];
24+
const currentInterval = sortedIntervals[i];
25+
26+
if (currentInterval[0] <= lastInterval[1]) {
27+
lastInterval[1] = Math.max(currentInterval[1], lastInterval[1]);
28+
} else {
29+
result.push(currentInterval);
30+
}
31+
}
32+
33+
return result;
34+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* class TreeNode {
4+
* val: number
5+
* left: TreeNode | null
6+
* right: TreeNode | null
7+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
8+
* this.val = (val===undefined ? 0 : val)
9+
* this.left = (left===undefined ? null : left)
10+
* this.right = (right===undefined ? null : right)
11+
* }
12+
* }
13+
*/
14+
15+
/**
16+
*@link https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/
17+
*
18+
* 접근 방법 :
19+
* - 작은 수대로 정렬해야 하니까 중위순회로 트리 순회
20+
* - 왼쪽 모드 끝까지 방문 -> 중간 노드 -> 오른쪽 끝까지 방문 으로 진행
21+
* - k번째 노드 체크하기 위해서 노드 방문할 때마다 count 업데이트
22+
*
23+
* 시간복잡도 : O(n)
24+
* - n = 노드의 개수,
25+
* - 최악의 경우 전체 트리 탐색
26+
*
27+
* 공간복잡도 : O(n)
28+
* - 재귀 호출이 트리 깊이만큼 스택 쌓임.
29+
* - 기울어진 트리의 경우 O(n)
30+
*/
31+
function kthSmallest(root: TreeNode | null, k: number): number {
32+
let count = 0;
33+
let result: number | null = null;
34+
35+
const inOrderTraverse = (node: TreeNode | null) => {
36+
if (!node) return null;
37+
38+
inOrderTraverse(node.left);
39+
40+
count++;
41+
if (count === k) {
42+
result = node.val;
43+
return;
44+
}
45+
46+
inOrderTraverse(node.right);
47+
};
48+
49+
inOrderTraverse(root);
50+
51+
return result!;
52+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
*@link https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
3+
*
4+
* 접근 방법 :
5+
* - BST니까 p,q 노드를 root 노드와 비교해서 탐색 범위 좁히기
6+
* - root.val보다 작은 경우 왼쪽 하위 트리 탐색
7+
* - root.vale보다 큰 경우 오른쪽 하위 트리 탐색
8+
* - 그 외의 경우는 값이 같으니까 root 노드 리턴
9+
*
10+
* 시간복잡도 : O(n)
11+
* - 균형 잡힌 BST의 경우 O(logn)
12+
* - 한쪽으로 치우친 트리의 경우 O(n)
13+
*
14+
* 공간복잡도 : O(n)
15+
* - 재귀 호출 스택 크기가 트리 깊이에 비례
16+
* - 균형 잡힌 BST의 경우 O(logn)
17+
* - 한쪽으로 치우친 트리의 경우 O(n)
18+
*/
19+
class TreeNode {
20+
val: number;
21+
left: TreeNode | null;
22+
right: TreeNode | null;
23+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
24+
this.val = val === undefined ? 0 : val;
25+
this.left = left === undefined ? null : left;
26+
this.right = right === undefined ? null : right;
27+
}
28+
}
29+
30+
function lowestCommonAncestor(
31+
root: TreeNode | null,
32+
p: TreeNode | null,
33+
q: TreeNode | null
34+
): TreeNode | null {
35+
if (!root || !p || !q) return null;
36+
37+
if (p.val < root.val && q.val < root.val)
38+
return lowestCommonAncestor(root.left, p, q);
39+
else if (p.val > root.val && q.val > root.val)
40+
return lowestCommonAncestor(root.right, p, q);
41+
else return root;
42+
}

meeting-rooms/mmyeon.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/**
2+
*@link https://leetcode.com/problems/meeting-rooms/description/
3+
*
4+
* 접근 방법 :
5+
* - 미팅 시작 시간이 빠른 순으로 정렬
6+
* - 현재 미팅 시작 시간이 이전 미팅 끝나는 시간보다 작으면 겹치는 것이므로 false 리턴
7+
*
8+
* 시간복잡도 : O(nlogn)
9+
* - n = intervals의 길이, 정렬했으므로 O(nlogn)
10+
*
11+
* 공간복잡도 : O(1)
12+
* - 고정된 변수만 사용
13+
*/
14+
15+
function canAttendMeetings(intervals: number[][]): boolean {
16+
intervals.sort((a, b) => a[0] - b[0]);
17+
18+
for (let i = 1; i < intervals.length; i++) {
19+
const previousMeetingTime = intervals[i - 1];
20+
const currentMeetingTime = intervals[i];
21+
if (currentMeetingTime[0] < previousMeetingTime[1]) return false;
22+
}
23+
24+
return true;
25+
}

merge-intervals/mmyeon.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,34 @@ function merge(intervals: number[][]): number[][] {
4141

4242
return result;
4343
}
44+
45+
/**
46+
* 접근 방법 :
47+
* - O(n)시간복잡도로 풀기 위해서 정렬하지 않고 intervals 병합
48+
* - 겹치지 않는 구간은 그대로 저장(left, right)
49+
* - newInterval과 겹치는 구간은 병합하여 하나의 interval로 대체
50+
*
51+
* 시간복잡도 : O(n)
52+
* - n = 인터벌 배열의 길이
53+
* - 1회 순회하면서 병합하므로 O(n)
54+
*
55+
* 공간복잡도 : O(n)
56+
* - 결과 배열에 담아서 리턴
57+
*/
58+
function insert(intervals: number[][], newInterval: number[]): number[][] {
59+
const left: number[][] = [];
60+
const right: number[][] = [];
61+
62+
for (const [start, end] of intervals) {
63+
if (end < newInterval[0]) {
64+
left.push([start, end]);
65+
} else if (newInterval[1] < start) {
66+
right.push([start, end]);
67+
} else {
68+
newInterval[0] = Math.min(newInterval[0], start);
69+
newInterval[1] = Math.max(newInterval[1], end);
70+
}
71+
}
72+
73+
return [...left, newInterval, ...right];
74+
}

0 commit comments

Comments
 (0)