Skip to content

Commit d751f6a

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents dc07413 + 681733f commit d751f6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+2187
-0
lines changed
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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} root
11+
* @return {number}
12+
*/
13+
var maxPathSum = function(root) {
14+
let max = root.val;
15+
16+
const dfs = (node) => {
17+
if (!node) {
18+
return 0;
19+
}
20+
21+
const left = Math.max(dfs(node.left), 0);
22+
const right = Math.max(dfs(node.right), 0);
23+
const sum = node.val + left + right;
24+
25+
max = Math.max(sum, max);
26+
27+
return node.val + Math.max(left, right);
28+
}
29+
30+
dfs(root);
31+
32+
return max;
33+
};
34+
35+
// 시간복잡도 O(n) -> 트리의 모든 노드를 재귀적으로 탐색하므로 복잡도는 노드의 수와 비례함
36+
// 공간복잡도 O(h) -> 입력된 트리의 최대 높이만큼 재귀 스택이 쌓이므로 공간복잡도는 트리의 높이와 같음

course-schedule/Chaedie.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
(해설을 보면서 따라 풀었습니다.)
3+
4+
Solution: graph 에서 circular 가 생기면 false, 아니면 true
5+
6+
n: numCourses
7+
p: number of preRequisites
8+
Time: O(n + p)
9+
Space: O(n + p)
10+
"""
11+
12+
13+
class Solution:
14+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
15+
graph = {i: [] for i in range(numCourses)}
16+
for crs, pre in prerequisites:
17+
graph[crs].append(pre)
18+
19+
traversing = set()
20+
finished = set()
21+
22+
def dfs(crs):
23+
if crs in traversing:
24+
return False
25+
if crs in finished:
26+
return True
27+
28+
traversing.add(crs)
29+
for pre in graph[crs]:
30+
if not dfs(pre):
31+
return False
32+
traversing.remove(crs)
33+
finished.add(crs)
34+
return True
35+
36+
for crs in graph:
37+
if not dfs(crs):
38+
return False
39+
return True

course-schedule/Jeehay28.js

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/**
2+
* @param {number} numCourses
3+
* @param {number[][]} prerequisites
4+
* @return {boolean}
5+
*/
6+
7+
// ✅ Graph DFS (Depth-First Search) approach
8+
// Time Complexity: O(V + E), where V is the number of courses (numCourses) and E is the number of prerequisites (edges).
9+
// Space Complexity: O(V + E), where V is the number of courses and E is the number of prerequisites.
10+
11+
var canFinish = function (numCourses, prerequisites) {
12+
// prerequisites = [
13+
// [1, 0], // Course 1 depends on Course 0
14+
// [2, 1], // Course 2 depends on Course 1
15+
// [3, 1], // Course 3 depends on Course 1
16+
// [3, 2] // Course 3 depends on Course 2
17+
// ];
18+
19+
// graph = {
20+
// 0: [1], // Course 0 is a prerequisite for Course 1
21+
// 1: [2, 3], // Course 1 is a prerequisite for Courses 2 and 3
22+
// 2: [3], // Course 2 is a prerequisite for Course 3
23+
// 3: [] // Course 3 has no prerequisites
24+
// };
25+
26+
// Build the graph
27+
const graph = {};
28+
29+
// for(let i=0; i<numCourses; i++) {
30+
// graph[i] = []
31+
// }
32+
33+
// Fill in the graph with prerequisites
34+
for (const [course, prereq] of prerequisites) {
35+
if (!graph[prereq]) {
36+
graph[prereq] = [];
37+
}
38+
graph[prereq].push(course);
39+
}
40+
41+
const visited = new Array(numCourses).fill(0);
42+
43+
const dfs = (course) => {
44+
if (visited[course] === 1) return false; // cycle detected!
45+
if (visited[course] === 2) return true; // already visited
46+
47+
visited[course] = 1;
48+
49+
// // Visit all the courses that depend on the current course
50+
for (const nextCourse of graph[course] || []) {
51+
if (!dfs(nextCourse)) {
52+
return false; // cycle detected!
53+
}
54+
}
55+
56+
visited[course] = 2; // fully visited and return true
57+
return true;
58+
};
59+
60+
// Check for each course whether it's possible to finish it
61+
for (let i = 0; i < numCourses; i++) {
62+
if (!dfs(i)) {
63+
return false; // cycle detected!
64+
}
65+
}
66+
67+
return true; // no cycles
68+
};
69+

course-schedule/Yjason-K.ts

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
2+
/**
3+
* 선수 과목과 이수 과목 관계를 확인하여 모든 과목을 이수할 수 있는지 여부 확인.
4+
* @param {number} numCourses - 전체 과목 수
5+
* @param {number[][]} prerequisites - 선수 과목과 이수 과목 관계 정보
6+
* @returns {boolean} - 모든 과목을 수강할 수 있는지 여부
7+
*
8+
* 시간 복잡도: O(V + E)
9+
* - 그래프를 생성하는 과정에서 O(E),
10+
* - bfs O(V + E),
11+
*
12+
* 공간 복잡도: O(V + E)
13+
* - 각 과목에 대한 선수 과목 저장에 O(V + E),
14+
* - prereqCount 저장에 O(V),
15+
* - 큐(queue) 저장에 O(V),
16+
*/
17+
function canFinish(numCourses: number, prerequisites: number[][]): boolean {
18+
// 각 과목의 선수 과목 정보를 저장하는 리스트
19+
const graph: number[][] = Array.from({ length: numCourses }, () => []);
20+
// 각 과목의 선수 과목 수 를 저장하는 배열
21+
const prereqCount: number[] = new Array(numCourses).fill(0);
22+
23+
// 그래프 및 선수 과목 개수 초기화
24+
for (const [course, prereq] of prerequisites) {
25+
graph[prereq].push(course); // 선수 과목을 들어야 수강 가능한 과목 추가
26+
prereqCount[course]++; // 해당 과목의 선수 과목 개수 증가
27+
}
28+
29+
// 선수 과목이 없는 과목들을 저장할 큐
30+
const queue: number[] = [];
31+
32+
// 선수 과목이 없는 과목들을 큐에 추가 (진입 차수가 0인 노드)
33+
for (let i = 0; i < numCourses; i++) {
34+
if (prereqCount[i] === 0) {
35+
queue.push(i);
36+
}
37+
}
38+
39+
// 수강한 과목 수
40+
let completedCourses = 0;
41+
42+
// 선수 과목이 없는 과목을 사용해서 다음 과목을 수강
43+
while (queue.length > 0) {
44+
const current = queue.shift()!;
45+
completedCourses++; // 과목 수강 완료
46+
47+
// 현재 과목을 선수 과목으로 하는 다른 과목들의 선수 과목 개수 감소
48+
for (const nextCourse of graph[current]) {
49+
prereqCount[nextCourse]--;
50+
51+
// 선수 과목 개수가 0이 되면 큐에 추가 (더 이상 기다릴 필요 없음)
52+
if (prereqCount[nextCourse] === 0) {
53+
queue.push(nextCourse);
54+
}
55+
}
56+
}
57+
58+
// 모든 과목을 수강 수 있는지 확인
59+
return completedCourses === numCourses;
60+
}
61+

course-schedule/ekgns33.java

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
*
3+
* solution : topological sort
4+
* tc : O(E + V)
5+
* sc : O(E + V)
6+
*
7+
* */
8+
class Solution {
9+
public boolean canFinish(int numCourses, int[][] prerequisites) {
10+
List<Integer>[] adj = new ArrayList[numCourses];
11+
for(int i = 0 ; i < numCourses; i++) {
12+
adj[i] = new ArrayList<>();
13+
}
14+
boolean[] v = new boolean[numCourses];
15+
int[] indeg = new int[numCourses];
16+
for(int[] pre : prerequisites) {
17+
int src = pre[0];
18+
int dst = pre[1];
19+
adj[src].add(dst);
20+
indeg[dst]++;
21+
}
22+
Queue<Integer> q = new LinkedList<>();
23+
for(int i = 0; i < numCourses; i ++) {
24+
if(indeg[i] == 0) {
25+
q.add(i);
26+
v[i] = true;
27+
}
28+
}
29+
int cnt= 0;
30+
while(!q.isEmpty()) {
31+
int curNode = q.poll();
32+
cnt++;
33+
for(int dst : adj[curNode]) {
34+
indeg[dst]--;
35+
if(indeg[dst] ==0 && !v[dst]) {
36+
q.add(dst);
37+
}
38+
}
39+
}
40+
41+
return cnt == numCourses;
42+
43+
}
44+
}

course-schedule/imsosleepy.java

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// 사이클을 찾는 문제. DFS를 이용해서 방문했는지 여부를 관리하고 체크하면된다.
2+
// DFS를 진행 중인 것을 들고 있어야 사이클 여부를 판단할 수 있다.
3+
// 간선 수와 노드의 수에 따라 시간 복잡도가 결정됨 O(N+L)
4+
class Solution {
5+
public boolean canFinish(int numCourses, int[][] prerequisites) {
6+
List<List<Integer>> graph = new ArrayList<>();
7+
for (int i = 0; i < numCourses; i++) {
8+
graph.add(new ArrayList<>());
9+
}
10+
11+
for (int[] pair : prerequisites) {
12+
graph.get(pair[1]).add(pair[0]);
13+
}
14+
15+
// 0: 방문 X
16+
// -1: DFS 진행 중
17+
// 1: 방문 완료
18+
int[] visited = new int[numCourses];
19+
20+
// 모든 노드에서 DFS 수행
21+
for (int i = 0; i < numCourses; i++) {
22+
if (dfs(graph, visited, i)) return false;
23+
}
24+
25+
return true;
26+
}
27+
28+
private boolean dfs(List<List<Integer>> graph, int[] visited, int node) {
29+
if (visited[node] == -1) return true; // 방문 중이면 사이클이 발견
30+
if (visited[node] == 1) return false;
31+
32+
visited[node] = -1; // 진행 중 표기
33+
for (int next : graph.get(node)) {
34+
if (dfs(graph, visited, next)) return true;
35+
}
36+
visited[node] = 1;
37+
38+
return false;
39+
}
40+
}

course-schedule/pmjuu.py

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'''
2+
시간 복잡도: O(V + E)
3+
- 위상 정렬(Topological Sort)을 사용하여 모든 노드(과목)와 간선(선수 과목 관계)을 탐색하므로 O(V + E)입니다.
4+
- V: 노드(과목) 개수 (numCourses)
5+
- E: 간선(선수 과목 관계) 개수 (prerequisites의 길이)
6+
7+
공간 복잡도: O(V + E)
8+
- 그래프를 인접 리스트로 저장하는 데 O(V + E) 공간이 필요합니다.
9+
- 추가적으로 방문 상태를 저장하는 리스트가 필요하여 O(V).
10+
- 따라서 총 공간 복잡도는 O(V + E)입니다.
11+
'''
12+
13+
from collections import deque
14+
from typing import List
15+
16+
class Solution:
17+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
18+
# 그래프 초기화
19+
graph = {i: [] for i in range(numCourses)}
20+
in_degree = {i: 0 for i in range(numCourses)}
21+
22+
# 선수 과목 정보 그래프에 저장
23+
for course, pre in prerequisites:
24+
graph[pre].append(course)
25+
in_degree[course] += 1
26+
27+
# 진입 차수가 0인 과목(선수 과목이 없는 과목)을 큐에 추가
28+
queue = deque([course for course in in_degree if in_degree[course] == 0])
29+
completed_courses = 0
30+
31+
while queue:
32+
current = queue.popleft()
33+
completed_courses += 1
34+
35+
for neighbor in graph[current]:
36+
in_degree[neighbor] -= 1
37+
if in_degree[neighbor] == 0:
38+
queue.append(neighbor)
39+
40+
# 모든 과목을 수강할 수 있다면 True, 아니면 False
41+
return completed_courses == numCourses

course-schedule/yolophg.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Time Complexity: O(V + E) - visit each course once and process all edges
2+
# Space Complexity: O(V + E) - storing the graph + recursion stack (worst case)
3+
4+
class Solution:
5+
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
6+
7+
# Build the adjacency list (prereq map)
8+
preMap = {i: [] for i in range(numCourses)}
9+
for crs, pre in prerequisites:
10+
preMap[crs].append(pre)
11+
12+
# tracks courses currently being checked (for cycle detection)
13+
visited = set()
14+
15+
def dfs(crs):
16+
# found a cycle
17+
if crs in visited:
18+
return False
19+
# no more prereqs left
20+
if preMap[crs] == []:
21+
return True
22+
23+
# mark as visiting
24+
visited.add(crs)
25+
26+
# check all prereqs for this course
27+
for pre in preMap[crs]:
28+
if not dfs(pre):
29+
# cycle detected, return False
30+
return False
31+
32+
# done checking, remove from visited
33+
visited.remove(crs)
34+
# mark as completed
35+
preMap[crs] = []
36+
return True
37+
38+
# run dfs on every course
39+
for crs in range(numCourses):
40+
if not dfs(crs):
41+
return False
42+
43+
return True

0 commit comments

Comments
 (0)