Skip to content

Commit 0b08e22

Browse files
committed
2 parents 43da9ea + 6dfa0c4 commit 0b08e22

30 files changed

+1208
-0
lines changed

โ€Žcourse-schedule/TonyKim9401.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// TC: O(n + p)
2+
// n -> number of courses, p -> the length of prerequisites
3+
// SC: O(n + m)
4+
// n -> the length of the graph size, m -> the length of nested list's size
5+
class Solution {
6+
public boolean canFinish(int numCourses, int[][] prerequisites) {
7+
List<List<Integer>> graph = new ArrayList<>();
8+
int[] inDegree = new int[numCourses];
9+
10+
for (int i = 0; i < numCourses; i++) graph.add(new ArrayList<>());
11+
12+
for (int[] prerequisite : prerequisites) {
13+
int course = prerequisite[0];
14+
int pre = prerequisite[1];
15+
graph.get(pre).add(course);
16+
inDegree[course] += 1;
17+
}
18+
19+
Queue<Integer> q = new LinkedList<>();
20+
for (int i = 0; i < numCourses; i++) {
21+
if (inDegree[i] == 0) q.offer(i);
22+
}
23+
24+
int visitedCourses = 0;
25+
while (!q.isEmpty()) {
26+
int course = q.poll();
27+
visitedCourses += 1;
28+
29+
for (int nextCourse : graph.get(course)) {
30+
inDegree[nextCourse] -= 1;
31+
if (inDegree[nextCourse] == 0) q.offer(nextCourse);
32+
}
33+
}
34+
35+
return visitedCourses == numCourses;
36+
}
37+
}

โ€Žcourse-schedule/haklee.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""TC: O(node + edge), SC: O(node + edge)
2+
3+
์œ ๋ช…ํ•œ ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฏ€๋กœ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค.
4+
"""
5+
6+
7+
class Solution:
8+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
9+
# ์œ„์ƒ ์ •๋ ฌ.
10+
11+
# init
12+
adj_list = [[] for _ in range(numCourses)] # SC: O(edge)
13+
in_deg = [0] * numCourses # SC: O(node)
14+
15+
for edge in prerequisites:
16+
adj_list[edge[0]].append(edge[1])
17+
in_deg[edge[1]] += 1
18+
19+
node_to_search = [i for i, v in enumerate(in_deg) if v == 0] # TC: O(node)
20+
sorted_list = []
21+
22+
# process
23+
while node_to_search:
24+
cur = node_to_search.pop() # TC: ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ด O(node)๋งŒํผ ์‹คํ–‰
25+
sorted_list.append(cur)
26+
for node in adj_list[cur]:
27+
in_deg[node] -= 1 # TC: ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ด O(edge)๋งŒํผ ์‹คํ–‰
28+
if in_deg[node] == 0:
29+
node_to_search.append(node)
30+
31+
return len(sorted_list) == numCourses

โ€Žcourse-schedule/jdalma.kt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `course-schedule` {
7+
8+
/**
9+
* TC: O(node + edge), SC: O(node + edge)
10+
*/
11+
fun canFinish(numCourses: Int, prerequisites: Array<IntArray>): Boolean {
12+
if (prerequisites.isEmpty()) return true
13+
14+
return usingTopologySort(numCourses, prerequisites)
15+
}
16+
17+
private fun usingTopologySort(numCourses: Int, prerequisites: Array<IntArray>): Boolean {
18+
val adj = List(numCourses) { mutableListOf<Int>() }
19+
val degree = IntArray(numCourses)
20+
for (e in prerequisites) {
21+
val (course, pre) = e[0] to e[1]
22+
adj[pre].add(course)
23+
degree[course]++
24+
}
25+
26+
val queue = ArrayDeque<Int>().apply {
27+
degree.forEachIndexed { index, i ->
28+
if (i == 0) {
29+
this.add(index)
30+
}
31+
}
32+
}
33+
34+
var answer = 0
35+
while (queue.isNotEmpty()) {
36+
val now = queue.removeFirst()
37+
answer++
38+
39+
queue.addAll(adj[now].filter { --degree[it] == 0 })
40+
}
41+
42+
return answer == numCourses
43+
}
44+
45+
@Test
46+
fun `์ฝ”์Šค์˜ ๊ฐœ์ˆ˜์™€ ์ฝ”์Šค ๊ฐ„ ์˜์กด์„ฑ์„ ์ „๋‹ฌํ•˜๋ฉด ์ฝ”์Šค๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
47+
canFinish(5,
48+
arrayOf(
49+
intArrayOf(0,1),
50+
intArrayOf(0,2),
51+
intArrayOf(1,3),
52+
intArrayOf(1,4),
53+
intArrayOf(3,4)
54+
)
55+
) shouldBe true
56+
canFinish(5,
57+
arrayOf(
58+
intArrayOf(1,4),
59+
intArrayOf(2,4),
60+
intArrayOf(3,1),
61+
intArrayOf(3,2)
62+
)
63+
) shouldBe true
64+
canFinish(2, arrayOf(intArrayOf(1, 0))) shouldBe true
65+
canFinish(2, arrayOf(intArrayOf(1, 0), intArrayOf(0, 1))) shouldBe false
66+
canFinish(20,
67+
arrayOf(
68+
intArrayOf(0,10),
69+
intArrayOf(3,18),
70+
intArrayOf(5,5),
71+
intArrayOf(6,11),
72+
intArrayOf(11,14),
73+
intArrayOf(13,1),
74+
intArrayOf(15,1),
75+
intArrayOf(17,4)
76+
)
77+
) shouldBe false
78+
}
79+
}

โ€Žcourse-schedule/kayden.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from collections import deque
2+
class Solution:
3+
# ์‹œ๊ฐ„๋ณต์žก๋„: O(numCourses + prerequisites์˜ ๊ธธ์ด)
4+
# ๊ณต๊ฐ„๋ณต์žก๋„: O(numCourses + prerequisites์˜ ๊ธธ์ด)
5+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
6+
7+
reachable = [0 for _ in range(numCourses)]
8+
graph = [[] for _ in range(numCourses)]
9+
10+
for a, b in prerequisites:
11+
reachable[a] += 1
12+
graph[b].append(a)
13+
14+
q = deque()
15+
visited = set()
16+
for i in range(numCourses):
17+
if reachable[i] == 0:
18+
q.append(i)
19+
visited.add(i)
20+
21+
while q:
22+
node = q.popleft()
23+
24+
for next_node in graph[node]:
25+
reachable[next_node] -= 1
26+
if next_node not in visited and reachable[next_node] == 0:
27+
q.append(next_node)
28+
visited.add(next_node)
29+
30+
if len(visited) == numCourses:
31+
return True
32+
33+
return False

โ€Žcourse-schedule/sunjae95.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* @description
3+
* memoization + dfs
4+
*
5+
* n = length of nums
6+
* p = length of prerequisites
7+
*
8+
* time complexity: O(n)
9+
* space complexity: O(p)
10+
*/
11+
var canFinish = function (numCourses, prerequisites) {
12+
const memo = Array.from({ length: numCourses + 1 }, () => false);
13+
const visited = Array.from({ length: numCourses + 1 }, () => false);
14+
// graph setting
15+
const graph = prerequisites.reduce((map, [linkedNode, current]) => {
16+
const list = map.get(current) ?? [];
17+
list.push(linkedNode);
18+
map.set(current, list);
19+
return map;
20+
}, new Map());
21+
22+
const dfs = (current) => {
23+
const linkedNode = graph.get(current);
24+
25+
if (memo[current] || !linkedNode || linkedNode.length === 0) return true;
26+
27+
for (const node of linkedNode) {
28+
if (visited[node]) return false;
29+
30+
visited[node] = true;
31+
if (!dfs(node)) return false;
32+
visited[node] = false;
33+
memo[node] = true;
34+
}
35+
36+
return true;
37+
};
38+
39+
for (const [current] of graph) {
40+
visited[current] = true;
41+
if (!dfs(current)) return false;
42+
visited[current] = false;
43+
memo[current] = true;
44+
}
45+
46+
return true;
47+
};

โ€Žcourse-schedule/wogha95.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* TC: O(V + E)
3+
* SC: O(V + E)
4+
* N: numCourses(all of vertex), P: prerequisites(all of edge)
5+
*/
6+
7+
/**
8+
* @param {number} numCourses
9+
* @param {number[][]} prerequisites
10+
* @return {boolean}
11+
*/
12+
var canFinish = function (numCourses, prerequisites) {
13+
const STEP = {
14+
before: 0,
15+
ing: 1,
16+
after: 2,
17+
};
18+
const stepBoard = Array.from({ length: numCourses }, () => STEP.before);
19+
const board = Array.from({ length: numCourses }, () => []);
20+
21+
for (const [a, b] of prerequisites) {
22+
board[a].push(b);
23+
}
24+
25+
for (let index = 0; index < numCourses; index++) {
26+
if (isCycle(index)) {
27+
return false;
28+
}
29+
}
30+
return true;
31+
32+
function isCycle(current) {
33+
if (stepBoard[current] === STEP.end) {
34+
return false;
35+
}
36+
if (stepBoard[current] === STEP.ing) {
37+
return true;
38+
}
39+
40+
stepBoard[current] = STEP.ing;
41+
for (const next of board[current]) {
42+
if (isCycle(next)) {
43+
return true;
44+
}
45+
}
46+
stepBoard[current] = STEP.end;
47+
return false;
48+
}
49+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// TC: O(n)
2+
// -> visit all nodes to invert
3+
// SC: O(n)
4+
// -> create all nodes again to exchange
5+
class Solution {
6+
public TreeNode invertTree(TreeNode root) {
7+
if (root == null) return null;
8+
invertTree(root.left);
9+
invertTree(root.right);
10+
TreeNode left = root.left;
11+
TreeNode right = root.right;
12+
root.left = right;
13+
root.right = left;
14+
return root;
15+
}
16+
}

โ€Žinvert-binary-tree/gitsunmin.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/**
2+
* https://leetcode.com/problems/invert-binary-tree/
3+
* time complexity : O(n)
4+
* space complexity : O(log N)
5+
*/
6+
7+
class TreeNode {
8+
val: number
9+
left: TreeNode | null
10+
right: TreeNode | null
11+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
12+
this.val = (val === undefined ? 0 : val)
13+
this.left = (left === undefined ? null : left)
14+
this.right = (right === undefined ? null : right)
15+
}
16+
}
17+
18+
export const dfs = (root: TreeNode | null, inverted: TreeNode | null): TreeNode | null => {
19+
if (!root) return null;
20+
21+
const left = dfs(root.left, inverted);
22+
const right = dfs(root.right, inverted);
23+
24+
root.left = right;
25+
root.right = left;
26+
27+
return root;
28+
};
29+
30+
function invertTree(root: TreeNode | null): TreeNode | null {
31+
if (!root) return null;
32+
33+
return dfs(root, new TreeNode(0));
34+
};

โ€Žinvert-binary-tree/haklee.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"""TC: O(n), SC: O(h)
2+
3+
h๋Š” ์ด์ง„ ํŠธ๋ฆฌ์˜ ๋†’์ด.
4+
n์ด ์ „์ฒด ๋…ธ๋“œ ๊ฐœ์ˆ˜๋ผ๊ณ  ํ• ๋•Œ
5+
- ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ•œ ์ชฝ ์ž์‹ ๋…ธ๋“œ๋งŒ ์ฑ„์›Œ์ง. ์ด ๊ฒฝ์šฐ h = n.
6+
- ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ. h = log(n).
7+
8+
์•„์ด๋””์–ด:
9+
์–‘์ชฝ ์ž์‹ ๋…ธ๋“œ์— ์ ‘๊ทผํ•ด์„œ ์žฌ๊ท€์ ์œผ๋กœ invert๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๋‘ ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋ฐ”๊พผ๋‹ค.
10+
11+
SC:
12+
- ํ˜ธ์ถœ ์Šคํƒ ๊นŠ์ด๋Š” ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊นŒ์ง€ ๊นŠ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, O(h).
13+
14+
TC:
15+
- ๋ชจ๋“  ๋…ธ๋“œ์— ์ ‘๊ทผ. O(n).
16+
"""
17+
18+
19+
# Definition for a binary tree node.
20+
# class TreeNode:
21+
# def __init__(self, val=0, left=None, right=None):
22+
# self.val = val
23+
# self.left = left
24+
# self.right = right
25+
class Solution:
26+
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
27+
def invert(node: Optional[TreeNode]) -> None:
28+
if node is not None:
29+
node.left, node.right = invert(node.right), invert(node.left)
30+
return node
31+
32+
return invert(root)

0 commit comments

Comments
ย (0)