Skip to content

Commit f3a850c

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 5c1f5b9 + a3c9195 commit f3a850c

File tree

20 files changed

+860
-0
lines changed

20 files changed

+860
-0
lines changed

โ€Žcourse-schedule/TonyKim9401.java

+37
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

+31
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

+79
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/sunjae95.js

+47
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+
};
+16
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/haklee.py

+32
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)

โ€Žinvert-binary-tree/jdalma.kt

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package leetcode_study
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Test
5+
6+
class `invert-binary-tree` {
7+
8+
fun invertTree(root: TreeNode?): TreeNode? {
9+
if (root == null) return null
10+
11+
return usingStack(root)
12+
}
13+
14+
/**
15+
* TC: O(n), SC: O(n)
16+
*/
17+
private fun usingDFS(node: TreeNode?): TreeNode? {
18+
if (node == null) return null
19+
20+
val (left, right) = node.left to node.right
21+
node.left = usingDFS(right)
22+
node.right = usingDFS(left)
23+
24+
return node
25+
}
26+
27+
/**
28+
* TC: O(n), SC: O(n)
29+
*/
30+
private fun usingStack(node: TreeNode): TreeNode {
31+
val stack= ArrayDeque<TreeNode>().apply {
32+
this.add(node)
33+
}
34+
35+
while (stack.isNotEmpty()) {
36+
val now = stack.removeLast()
37+
val tmp = now.left
38+
now.left = now.right
39+
now.right = tmp
40+
41+
now.left?.let { stack.add(it) }
42+
now.right?.let { stack.add(it) }
43+
}
44+
return node
45+
}
46+
47+
@Test
48+
fun `์ „๋‹ฌ๋œ ๋…ธ๋“œ์˜ ํ•˜์œ„ ๋…ธ๋“œ๋“ค์˜ ๋ฐ˜์ „๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค`() {
49+
val actual = TreeNode.of(4,2,7,1,3,6,9)
50+
val expect = TreeNode.of(4,7,2,9,6,3,1)
51+
invertTree(actual) shouldBe expect
52+
53+
val actual1 = TreeNode.of(1,2)
54+
val expect1 = TreeNode.of(1,null,2)
55+
56+
invertTree(actual1) shouldBe expect1
57+
}
58+
}

โ€Žinvert-binary-tree/sunjae95.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @description
3+
* brainstorming:
4+
* preorder traverse
5+
*
6+
* n = length of root
7+
* time complexity: O(n)
8+
* space complexity: O(n)
9+
*/
10+
var invertTree = function (root) {
11+
const preOrder = (tree) => {
12+
if (tree === null) return null;
13+
14+
const currentNode = new TreeNode(tree.val);
15+
16+
currentNode.right = preOrder(tree.left);
17+
currentNode.left = preOrder(tree.right);
18+
19+
return currentNode;
20+
};
21+
22+
return preOrder(root);
23+
};

โ€Žjump-game/TonyKim9401.java

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// TC: O(n)
2+
// SC: O(1)
3+
class Solution {
4+
public boolean canJump(int[] nums) {
5+
int jump = 0;
6+
7+
for (int i = 0; i < nums.length; i++) {
8+
if (i > jump) return false;
9+
jump = Math.max(jump, i + nums[i]);
10+
}
11+
return true;
12+
}
13+
}

โ€Žjump-game/haklee.py

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""TC: O(n), SC: O(1)
2+
3+
n์€ ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด
4+
5+
์•„์ด๋””์–ด:
6+
- ๋์— ์žˆ๋Š” ์•„์ดํ…œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ '์ตœ์†Œ ์–ด๋””๊นŒ์ง€๋Š” ๋„๋‹ฌํ•ด์•ผ ๋ ์นธ๊นŒ์ง€ ์ ํ”„ ๊ฐ€๋Šฅํ•œ์ง€'๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
7+
- example๋“ค๋กœ ์ดํ•ดํ•ด๋ณด์ž. index๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘.
8+
- example 1: [2,3,1,1,4]
9+
- 4๋ฒˆ์งธ ์นธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ฑ๊ณต์ด๋‹ค. reach_at_least ๊ฐ’์„ 4๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
10+
- 3๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 4๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ ์–ด๋„ 3๋ฒˆ ์นธ๊นŒ์ง€ ๊ฐ€๋ฉด ์„ฑ๊ณต์ด๋ฏ€๋กœ
11+
reach_at_least๋ฅผ 3์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
12+
- 2๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. reach_at_least๋ฅผ 2๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
13+
- 1๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 1+3=4๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ด ์นธ์—์„œ ํ˜„ reach_at_least ๊ฐ’์ธ 2๋ฒˆ์งธ ์นธ๊นŒ์ง€
14+
์ถฉ๋ถ„ํžˆ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ reach_at_least ๊ฐ’์„ 1๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
15+
- 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 0+2=2๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ํ˜„ reach_at_least ๊ฐ’์ธ 1๋ฒˆ์งธ ์นธ๊นŒ์ง€ ์ถฉ๋ถ„ํžˆ
16+
๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ reach_at_least ๊ฐ’์„ 0์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
17+
- 0๋ฒˆ์งธ ์นธ์—์„œ ๋ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
18+
- example 2: [3,2,1,0,4]
19+
- 4๋ฒˆ์งธ ์นธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ฑ๊ณต์ด๋‹ค. reach_at_least ๊ฐ’์„ 4๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
20+
- 3๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ˜„ reach_at_least ๊ฐ’์ธ 4๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†์œผ๋‹ˆ
21+
์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
22+
- 2๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 2+1=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ํ˜„ reach_at_least ๊ฐ’์ธ 4๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๊ณ ,
23+
์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
24+
- 1๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 1+2=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
25+
- 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ์ตœ๋Œ€ 0+3=3๋ฒˆ์งธ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.
26+
- reach_at_least ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋‹ค. ์ฆ‰, 0๋ฒˆ์งธ ์นธ์—์„œ๋Š” ๋ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋‹ค.
27+
28+
SC:
29+
- reach_at_least ๊ฐ’์— ์ธ๋ฑ์Šค ํ•˜๋‚˜๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค. ์ฆ‰, O(1).
30+
31+
TC:
32+
- nums์˜ ๋์—์„œ ๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ๊นŒ์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ reach_at_least๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. O(n).
33+
"""
34+
35+
36+
class Solution:
37+
def canJump(self, nums: List[int]) -> bool:
38+
reach_at_least = len(nums) - 1
39+
40+
for i in range(len(nums) - 2, -1, -1):
41+
if nums[i] + i >= reach_at_least:
42+
reach_at_least = i
43+
44+
return reach_at_least == 0

0 commit comments

Comments
ย (0)