/*
총 numCourses개의 코스를 수강해야 하며, 각 코스는 0부터 numCourses - 1까지 번호가 매겨져 있습니다.
배열 prerequisites가 주어지는데, prerequisites[i] = [ai, bi]는 코스 ai를
듣기 위해 먼저 코스 bi를 이수해야 함을 의미합니다.
예를 들어, [0, 1]이 주어지면 코스 0을 듣기 전에 코스 1을 먼저 수강해야 한다는 뜻입니다.
모든 코스를 이수할 수 있으면 true를, 그렇지 않으면 false를 반환하세요.
*/
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
Deque <Integer> dq = new ArrayDeque<>();
List <List<Integer>> list = new ArrayList<>();
for (int i = 0; i < 2000; i++) {
list.add(new ArrayList<>());
}
int [] degree = new int[numCourses];
Arrays.fill(degree, 0);
for(int i=0; i<prerequisites.length; i++) {
int a = prerequisites[i][0];
int b = prerequisites[i][1];
list.get(b).add(a);
degree[a] ++;
}
// 초기값 세팅
for(int i=0; i<degree.length; i++) {
if(degree[i] == 0) {
dq.addLast(i);
}
}
while(!dq.isEmpty()) {
int course = dq.pollFirst();
for(int nextCourse : list.get(course)) {
degree[nextCourse] --;
if(degree[nextCourse] == 0)
dq.addLast(nextCourse);
}
list.get(course).clear();
}
boolean result = true;
for(int i=0; i<degree.length; i++) {
if(degree[i] != 0) {
result = false;
}
}
return result;
}
}
Example 1:
Input: numCourses = 2, prerequisites = [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take.
To take course 1 you should have finished course 0. So it is possible.
순서가 있는 그래프가 주어지고 주어진 순서에 맞게 끝내는 문제이다.
이 문제를 볼때 위상정렬이 떠올라야한다.
위상정렬은 다음과 같이 진행이된다.
1.진입차수를 관리해야한다.
2.진입차수가 0인 값을 가장 먼저 큐에 넣는다.
3. 큐에 값을 뽑고 해당값과 연결되어 있는 노드를 다시 큐에 넣는다.(단 그 노드의 진입차수가 0일 경우에만)
4. 2~3 반복한다.
'Algorithm' 카테고리의 다른 글
leetcode 1334 플로이드 와샬 floyd (0) | 2025.03.28 |
---|---|
leetcode 743 dijkstra (0) | 2025.03.27 |
leetcode 102 dfs preorder (0) | 2025.03.27 |
leetcode 79 dfs+백트래킹 (0) | 2025.03.27 |
leetcode 64 java dp (0) | 2025.03.13 |