Skip to content

Commit f5c36f7

Browse files
authored
Merge pull request #1548 from HoonDongKang/main
[HoonDongKang] Week 10 Solutions
2 parents 0adc250 + 97e10ba commit f5c36f7

File tree

5 files changed

+299
-0
lines changed

5 files changed

+299
-0
lines changed

course-schedule/HoonDongKang.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* [Problem]: [207] Course Schedule
3+
* (https://leetcode.com/problems/course-schedule/description/)
4+
*/
5+
6+
function canFinish(numCourses: number, prerequisites: number[][]): boolean {
7+
// 시간복잡도 O(n+m)
8+
// 공간복잡도 O(n+m)
9+
function graphFunc(numCourses: number, prerequisites: number[][]): boolean {
10+
const graph: number[][] = Array.from({ length: numCourses }, () => []);
11+
12+
for (const [course, prerequisite] of prerequisites) {
13+
graph[prerequisite].push(course);
14+
}
15+
16+
let traversing = new Array(numCourses).fill(false);
17+
let visited = new Array(numCourses).fill(false);
18+
19+
function dfs(course: number): boolean {
20+
if (traversing[course]) return false;
21+
if (visited[course]) return true;
22+
23+
traversing[course] = true;
24+
for (let pre of graph[course]) {
25+
if (!dfs(pre)) {
26+
return false;
27+
}
28+
}
29+
30+
traversing[course] = false;
31+
visited[course] = true;
32+
return true;
33+
}
34+
35+
for (let i = 0; i < numCourses; i++) {
36+
if (!visited[i] && !dfs(i)) {
37+
return false;
38+
}
39+
}
40+
return true;
41+
}
42+
}

invert-binary-tree/HoonDongKang.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* [Problem]: [226] Invert Binary Tree
3+
* (https://leetcode.com/problems/invert-binary-tree/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
function invertTree(root: TreeNode | null): TreeNode | null {
18+
// 시간복잡도 O(n)
19+
// 공간복잡도 O(n)
20+
function recursiveFunc(root: TreeNode | null): TreeNode | null {
21+
if (root === null) {
22+
return null;
23+
}
24+
25+
const temp = root.left;
26+
root.left = invertTree(root.right);
27+
root.right = invertTree(temp);
28+
29+
return root;
30+
}
31+
// 시간복잡도 O(n)
32+
// 공간복잡도 O(n)
33+
function stackFunc(root: TreeNode | null): TreeNode | null {
34+
if (root === null) {
35+
return null;
36+
}
37+
38+
const stack: Array<TreeNode | null> = [root];
39+
40+
while (stack.length > 0) {
41+
const node = stack.pop()!;
42+
43+
if (node === null) {
44+
continue;
45+
}
46+
47+
[node.left, node.right] = [node.right, node.left];
48+
stack.push(node.left, node.right);
49+
}
50+
51+
return root;
52+
}
53+
}

jump-game/HoonDongKang.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/**
2+
* [Problem]: [55] Jump Game
3+
* (https://leetcode.com/problems/jump-game/description/)
4+
*/
5+
function canJump(nums: number[]): boolean {
6+
// 시간복잡도 O(N^N)
7+
// 공간복잡도 O(N)
8+
// Time Limit Exceeded
9+
function dfsFunc(nums: number[]): boolean {
10+
function dfs(start: number): boolean {
11+
if (start === nums.length - 1) return true;
12+
for (let i = 1; i <= nums[start]; i++) {
13+
if (dfs(start + i)) return true;
14+
}
15+
return false;
16+
}
17+
return dfs(0);
18+
}
19+
// 시간복잡도 O(N^2)
20+
// 공간복잡도 O(N)
21+
function dpFunc(nums: number[]): boolean {
22+
const n = nums.length;
23+
const dp = Array(n).fill(false);
24+
dp[0] = true;
25+
26+
for (let i = 1; i < n; i++) {
27+
for (let j = 0; j < i; j++) {
28+
if (dp[j] && j + nums[j] >= i) {
29+
dp[i] = true;
30+
break;
31+
}
32+
}
33+
}
34+
35+
return dp[n - 1];
36+
}
37+
// 시간복잡도 O(N^2)
38+
// 공간복잡도 O(N)
39+
function memoFunc(nums: number[]): boolean {
40+
let memo = new Map<number, boolean>();
41+
42+
function dfs(start: number): boolean {
43+
if (start === nums.length - 1) return true;
44+
if (memo.has(start)) return memo.get(start)!;
45+
for (let i = 1; i <= nums[start]; i++) {
46+
if (dfs(start + i)) {
47+
memo.set(start, true);
48+
return true;
49+
}
50+
}
51+
52+
memo.set(start, false);
53+
return false;
54+
}
55+
56+
return dfs(0);
57+
}
58+
59+
// 시간복잡도 O(N)
60+
// 공간복잡도 O(1)
61+
function greedyFunc(nums: number[]): boolean {
62+
let reach = 0;
63+
for (let i = 0; i < nums.length; i++) {
64+
if (i <= reach) {
65+
reach = Math.max(reach, i + nums[i]);
66+
}
67+
}
68+
69+
return nums.length - 1 <= reach;
70+
}
71+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/**
2+
* [Problem]: [23] Merge k Sorted Lists
3+
* (https://leetcode.com/problems/merge-k-sorted-lists/description/)
4+
*/
5+
6+
class ListNode {
7+
val: number;
8+
next: ListNode | null;
9+
constructor(val?: number, next?: ListNode | null) {
10+
this.val = val === undefined ? 0 : val;
11+
this.next = next === undefined ? null : next;
12+
}
13+
}
14+
15+
function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
16+
//시간복잡도: O(n log n)
17+
//공간복잡도: O(n)
18+
function bruteForceFunc(lists: Array<ListNode | null>): ListNode | null {
19+
const arr: number[] = [];
20+
let dummy = new ListNode(0);
21+
let current = dummy;
22+
23+
if (!lists.length) return null;
24+
25+
for (let i = 0; i < lists.length; i++) {
26+
let currentNode = lists[i];
27+
while (currentNode) {
28+
arr.push(currentNode.val);
29+
currentNode = currentNode.next;
30+
}
31+
}
32+
33+
arr.sort((a, b) => a - b);
34+
35+
for (let j = 0; j < arr.length; j++) {
36+
current.next = new ListNode(arr[j]);
37+
current = current.next;
38+
}
39+
40+
return dummy.next;
41+
}
42+
43+
//시간복잡도: O(nk)
44+
//공간복잡도: O(n)
45+
function mergeFunc(lists: Array<ListNode | null>): ListNode | null {
46+
let dummy = new ListNode(0);
47+
let cur = dummy;
48+
49+
while (lists.some((node) => node !== null)) {
50+
let minVal = Infinity;
51+
let minIdx = -1;
52+
53+
for (let i = 0; i < lists.length; i++) {
54+
if (lists[i] && lists[i]!.val < minVal) {
55+
minVal = lists[i]!.val;
56+
minIdx = i;
57+
}
58+
}
59+
60+
if (minIdx !== -1) {
61+
cur.next = new ListNode(minVal);
62+
cur = cur.next;
63+
lists[minIdx] = lists[minIdx]!.next;
64+
}
65+
}
66+
67+
return dummy.next;
68+
}
69+
//시간복잡도: O(n log k)
70+
//공간복잡도: O(log k)
71+
function divideAndConqureFunc(lists: Array<ListNode | null>): ListNode | null {
72+
if (!lists.length) return null;
73+
if (lists.length === 1) return lists[0];
74+
75+
const mid = Math.floor(lists.length / 2);
76+
const left = divideAndConqureFunc(lists.slice(0, mid));
77+
const right = divideAndConqureFunc(lists.slice(mid));
78+
79+
function mergeTwoLists(list1: ListNode | null, list2: ListNode | null): ListNode | null {
80+
const dummy = new ListNode(-1);
81+
let cur = dummy;
82+
83+
while (list1 && list2) {
84+
if (list1.val < list2.val) {
85+
cur.next = list1;
86+
list1 = list1.next;
87+
} else {
88+
cur.next = list2;
89+
list2 = list2.next;
90+
}
91+
92+
cur = cur.next;
93+
}
94+
95+
cur.next = list1 ?? list2;
96+
return dummy.next;
97+
}
98+
99+
return mergeTwoLists(left, right);
100+
}
101+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* [Problem]: [33] Search in Rotated Sorted Array
3+
* (https://leetcode.com/problems/search-in-rotated-sorted-array/description/)
4+
*/
5+
function search(nums: number[], target: number): number {
6+
//시간복잡도 O(log n)
7+
//공간복잡도 O(1)
8+
let left = 0;
9+
let right = nums.length - 1;
10+
11+
while (left <= right) {
12+
let mid = Math.floor((left + right) / 2);
13+
14+
if (nums[mid] === target) return mid;
15+
16+
if (nums[left] <= nums[mid]) {
17+
if (nums[left] <= target && target < nums[mid]) {
18+
right = mid - 1;
19+
} else {
20+
left = mid + 1;
21+
}
22+
} else {
23+
if (nums[mid] < target && target <= nums[right]) {
24+
left = mid + 1;
25+
} else {
26+
right = mid - 1;
27+
}
28+
}
29+
}
30+
31+
return -1;
32+
}

0 commit comments

Comments
 (0)