Skip to content

Commit bf31779

Browse files
authored
Merge pull request #1588 from uraflower/main
[uraflower] Week12 Solutions
2 parents 629f902 + 4500272 commit bf31779

File tree

5 files changed

+217
-0
lines changed

5 files changed

+217
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* 구간이 겹치지 않게 하기 위해 최소한의 구간을 없애야 할 때, 몇 개를 없애야 하는지 반환하는 함수
3+
* @param {number[][]} intervals
4+
* @return {number}
5+
*/
6+
const eraseOverlapIntervals = function(intervals) {
7+
intervals.sort((a,b) => a[0] - b[0]);
8+
9+
let count = 0;
10+
let prevEnd = intervals[0][1];
11+
12+
for (let i = 1; i < intervals.length; i++) {
13+
const [start, end] = intervals[i];
14+
15+
// 범위가 겹치는 경우
16+
if (prevEnd > start) {
17+
count++;
18+
prevEnd = Math.min(prevEnd, end); // end가 큰 걸 삭제한다 치기
19+
}
20+
}
21+
22+
return count;
23+
};
24+
25+
// 시간복잡도: O(n * log n)
26+
// 공간복잡도: O(1)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
/**
3+
* @param n: the number of vertices
4+
* @param edges: the edges of undirected graph
5+
* @return: the number of connected components
6+
*/
7+
const countComponents = function (n, edges) {
8+
// graph 만들기
9+
const graph = Array.from({ length: n }).map(() => []);
10+
11+
for (const [u, v] of edges) {
12+
graph[u].push(v);
13+
graph[v].push(u);
14+
}
15+
16+
// 각 노드 순회하기
17+
let count = 0;
18+
const visited = new Set();
19+
20+
for (let i = 0; i < n; i++) {
21+
if (visited.has(i)) {
22+
continue;
23+
}
24+
25+
count += 1;
26+
27+
// bfs
28+
const queue = [i];
29+
visited.add(i);
30+
31+
while (queue.length) {
32+
const u = queue.shift();
33+
34+
for (const v of graph[u]) {
35+
if (!visited.has(v)) {
36+
visited.add(v);
37+
queue.push(v);
38+
}
39+
}
40+
}
41+
}
42+
43+
return count;
44+
}
45+
46+
// 시간복잡도: O(E)
47+
// 공간복잡도: O(V)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val, next) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.next = (next===undefined ? null : next)
6+
* }
7+
*/
8+
9+
// 첫 번째 풀이
10+
// 시간복잡도: O(n)
11+
// 공간복잡도: O(n)
12+
/**
13+
* @param {ListNode} head
14+
* @param {number} n
15+
* @return {ListNode}
16+
*/
17+
const removeNthFromEnd = function (head, n) {
18+
function dfs(node) {
19+
// 마지막 노드이면 1 반환
20+
if (!node.next) {
21+
return 1;
22+
}
23+
24+
const nth = dfs(node.next);
25+
if (nth === n) {
26+
node.next = node.next.next ?? null;
27+
}
28+
29+
return nth + 1;
30+
}
31+
32+
if (dfs(head) === n) {
33+
return head.next;
34+
}
35+
36+
return head;
37+
};
38+
39+
// 두 번째 풀이
40+
// 시간복잡도: O(n)
41+
// 공간복잡도: O(1)
42+
const removeNthFromEnd = function (head, n) {
43+
const temp = new ListNode(0, head);
44+
let tail = temp;
45+
let prev = temp; // 뒤에서 n번째 노드
46+
47+
for (let i = 0; i < n; i++) {
48+
tail = tail.next;
49+
}
50+
51+
while (tail.next) {
52+
tail = tail.next;
53+
prev = prev.next;
54+
}
55+
56+
prev.next = prev.next.next;
57+
58+
return temp.next;
59+
};

same-tree/uraflower.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val, left, right) {
4+
* this.val = (val===undefined ? 0 : val)
5+
* this.left = (left===undefined ? null : left)
6+
* this.right = (right===undefined ? null : right)
7+
* }
8+
*/
9+
/**
10+
* @param {TreeNode} p
11+
* @param {TreeNode} q
12+
* @return {boolean}
13+
*/
14+
const isSameTree = function(p, q) {
15+
if (!p && !q) return true;
16+
return p?.val === q?.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
17+
};
18+
19+
// 시간복잡도: O(n)
20+
// 공간복잡도: O(h) (h: 트리의 높이, 즉 재귀 호출 스택)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
9+
const NULL_SIGN = 'X';
10+
11+
/**
12+
* Encodes a tree to a single string.
13+
* 시간복잡도: O(n)
14+
* 공간복잡도: O(h) (h: 재귀 스택 깊이 즉 트리 높이)
15+
* @param {TreeNode} root
16+
* @return {string}
17+
*/
18+
const serialize = function (root) {
19+
const result = [];
20+
21+
function traverse(root) {
22+
result.push(root?.val ?? NULL_SIGN);
23+
if (!root) {
24+
return;
25+
}
26+
traverse(root.left);
27+
traverse(root.right);
28+
}
29+
30+
traverse(root);
31+
return result.join(',');
32+
};
33+
34+
/**
35+
* Decodes your encoded data to tree.
36+
* 시간복잡도: O(n)
37+
* 공간복잡도: O(h) (h: 재귀 스택 깊이 즉 트리 높이)
38+
* @param {string} data
39+
* @return {TreeNode}
40+
*/
41+
const deserialize = function (data) {
42+
const splited = data.split(',');
43+
let i = 0;
44+
45+
function makeTree() {
46+
if (splited[i] === NULL_SIGN) {
47+
return null;
48+
}
49+
50+
const node = new TreeNode(Number(splited[i]));
51+
i += 1;
52+
node.left = makeTree();
53+
i += 1;
54+
node.right = makeTree();
55+
56+
return node;
57+
}
58+
59+
return makeTree();
60+
};
61+
62+
/**
63+
* Your functions will be called as such:
64+
* deserialize(serialize(root));
65+
*/

0 commit comments

Comments
 (0)