Skip to content

Commit e3a00b4

Browse files
committed
add solution : 207. Course Schedule
1 parent 00be0fc commit e3a00b4

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

β€Žcourse-schedule/mmyeon.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/**
2+
* @link https://leetcode.com/problems/course-schedule/description/
3+
*
4+
* μ ‘κ·Ό 방법 :
5+
* - μ£Όμ–΄μ§„ κ³Όλͺ©μ—μ„œ μ„ μˆ˜ κ³Όλͺ© 사이클이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄μ„œ dfs μ‚¬μš©
6+
* - 사이클이 μžˆλ‹€λŠ” 건 탐색 쀑에 λ‹€μ‹œ 동일 κ³Όλͺ©μ΄ λ“±μž₯ν•œ κ²½μš°λ‹ˆκΉŒ, κ³Όλͺ©λ³„ κ²°κ³Ό μ €μž₯ν•˜κΈ° μœ„ν•΄μ„œ visited λ°°μ—΄ μ‚¬μš©
7+
*
8+
* μ‹œκ°„λ³΅μž‘λ„ : O(n + e)
9+
* - n = λ“€μ–΄μ•Ό ν•˜λŠ” κ³Όλͺ© 수
10+
* - e = μ„ μˆ˜ κ³Όλͺ©κ³Ό μ—°κ²°λœ κ³Όλͺ© 수
11+
* - μ„ μˆ˜ κ³Όλͺ© dfs ν˜ΈμΆœν•˜κ³ , μ„ μˆ˜ κ³Όλͺ©κ³Ό μ—°κ²°λœ κ³Όλͺ©λ„ ν˜ΈμΆœν•¨
12+
*
13+
* κ³΅κ°„λ³΅μž‘λ„ : O(n + e)
14+
* - n = λ“€μ–΄μ•Ό ν•˜λŠ” κ³Όλͺ© 수
15+
* - e = μ„ μˆ˜ κ³Όλͺ©κ³Ό μ—°κ²°λœ κ³Όλͺ© 수
16+
* - visited λ°°μ—΄ : O(n)
17+
* - Map : O(e)
18+
*/
19+
20+
function canFinish(numCourses: number, prerequisites: number[][]): boolean {
21+
// μ„ μˆ˜ κ³Όλͺ©μ„ ν‚€, 후속 κ³Όλͺ©μ„ κ°’μœΌλ‘œ μ €μž₯
22+
const map = new Map<number, number[]>();
23+
24+
for (const [course, prerequisite] of prerequisites) {
25+
if (!map.has(prerequisite)) map.set(prerequisite, []);
26+
map.get(prerequisite)!.push(course);
27+
}
28+
29+
// 이미 탐색쀑인 κ³Όλͺ©μΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•œ λ°°μ—΄
30+
// 미탐색 : 0, 탐색쀑: 1, νƒμƒ‰μ™„λ£Œ : 2둜 처리
31+
const visited = Array(numCourses).fill(0);
32+
33+
const dfs = (course: number) => {
34+
// 탐색쀑이면 사이클이 λ°œμƒ
35+
if (visited[course] === 1) return false;
36+
// 탐색 μ™„λ£ŒμΈ κ³Όλͺ©μ€ 사이클이 μ—†λŠ” μƒνƒœλ‹ˆκΉŒ true 리턴
37+
if (visited[course] === 2) return true;
38+
39+
// 탐색 μ‹œμž‘
40+
// 탐색 쀑인 μƒνƒœλ‘œ λ³€κ²½
41+
visited[course] = 1;
42+
43+
const nextCourses = map.get(course) ?? [];
44+
45+
// 후속 κ³Όλͺ© λͺ¨λ‘ 체크
46+
for (const nextCourse of nextCourses) {
47+
if (!dfs(nextCourse)) return false;
48+
}
49+
50+
// 탐색 μ™„λ£Œ μƒνƒœλ‘œ λ³€κ²½
51+
visited[course] = 2;
52+
return true;
53+
};
54+
55+
// λ“€μ–΄μ•Ό ν•˜λŠ” λͺ¨λ“  κ³Όλͺ©μ— λŒ€ν•΄ dfs 호좜
56+
for (let i = 0; i < numCourses; i++) {
57+
// 미탐색 λ…Έλ“œλ§Œ νƒμƒ‰ν•˜λ„λ‘ 처리
58+
if (visited[i] === 0 && !dfs(i)) return false;
59+
}
60+
61+
return true;
62+
}

0 commit comments

Comments
Β (0)