Skip to content

Commit d67575a

Browse files
committed
course-schedule solution
1 parent d20e519 commit d67575a

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/**
2+
* @param {number} numCourses
3+
* @param {number[][]} prerequisites
4+
* @return {boolean}
5+
*/
6+
var canFinish = function (numCourses, prerequisites) {
7+
if (numCourses === 1) return true; // ๊ณผ๋ชฉ์ด 1๊ฐœ๋ฉด ๋ฌด์กฐ๊ฑด ์ˆ˜๊ฐ• ๊ฐ€๋Šฅ
8+
9+
let adjList = new Map(); // ๊ฐ ๊ณผ๋ชฉ์— ๋Œ€ํ•ด ์„ ํ–‰ ๊ณผ๋ชฉ๋“ค์„ ์ €์žฅํ•˜๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
10+
let visited = new Set(); // ์ด๋ฏธ ์ˆ˜๊ฐ• ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋œ ๊ณผ๋ชฉ๋“ค
11+
let path = new Set(); // ํ˜„์žฌ DFS ๊ฒฝ๋กœ์— ํฌํ•จ๋œ ๊ณผ๋ชฉ๋“ค (์‚ฌ์ดํด ํ™•์ธ์šฉ)
12+
13+
// ๋ชจ๋“  ๊ณผ๋ชฉ์„ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ์— ์ดˆ๊ธฐํ™”
14+
for (let i = 0; i < numCourses; i++) {
15+
adjList.set(i, []);
16+
}
17+
18+
// prerequisite ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๊ตฌ์„ฑ
19+
for (let i = 0; i < prerequisites.length; i++) {
20+
// [0, 1]์€ 0์„ ๋“ฃ๊ธฐ ์œ„ํ•ด 1์„ ๋จผ์ € ๋“ค์–ด์•ผ ํ•จ
21+
adjList.get(prerequisites[i][0]).push(prerequisites[i][1]);
22+
}
23+
24+
// DFS ํ•จ์ˆ˜: ํ•ด๋‹น course๋ฅผ ์ˆ˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
25+
const canTake = (course) => {
26+
if (visited.has(course)) return true; // ์ด๋ฏธ ํ™•์ธ๋œ ์ฝ”์Šค๋Š” ์žฌํ™•์ธ ํ•„์š” ์—†์Œ
27+
if (path.has(course)) return false; // ํ˜„์žฌ DFS ๊ฒฝ๋กœ์— course๊ฐ€ ์žˆ๋‹ค๋ฉด ์‚ฌ์ดํด ๋ฐœ์ƒ
28+
29+
path.add(course); // ํ˜„์žฌ ๊ฒฝ๋กœ์— course ์ถ”๊ฐ€
30+
31+
let preCourses = adjList.get(course); // course๋ฅผ ๋“ฃ๊ธฐ ์œ„ํ•œ ์„ ํ–‰ ๊ณผ๋ชฉ๋“ค
32+
for (let i = 0; i < preCourses.length; i++) {
33+
if (!canTake(preCourses[i])) return false; // ์„ ํ–‰ ๊ณผ๋ชฉ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด ์ข…๋ฃŒ
34+
}
35+
36+
path.delete(course); // ๊ฒฝ๋กœ์—์„œ ์ œ๊ฑฐ (๋ฐฑํŠธ๋ž˜ํ‚น)
37+
visited.add(course); // ์ˆ˜๊ฐ• ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ™•์ธ
38+
return true;
39+
};
40+
41+
// ๋ชจ๋“  ๊ณผ๋ชฉ์— ๋Œ€ํ•ด ์ˆ˜๊ฐ• ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
42+
for (let i = 0; i < numCourses; i++) {
43+
path = new Set(); // ์ƒˆ๋กœ์šด DFS ํƒ์ƒ‰์ด๋ฏ€๋กœ ๊ฒฝ๋กœ ์ดˆ๊ธฐํ™”
44+
if (!canTake(i)) return false; // ํ•œ ๊ณผ๋ชฉ์ด๋ผ๋„ ๋ชป ๋“ค์œผ๋ฉด false
45+
}
46+
47+
return true; // ๋ชจ๋“  ๊ณผ๋ชฉ ์ˆ˜๊ฐ• ๊ฐ€๋Šฅ
48+
};

0 commit comments

Comments
ย (0)