|
| 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 | + |
0 commit comments