Notice
Recent Posts
Recent Comments
Link
허허의 오늘은 뭐 먹지?
[leetcode] 207. Course Schedule 본문
이 문제는 전형적인 topological sort (위상정렬) 문제입니다.
leetcode.com/problems/course-schedule/
Course Schedule - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
위키에 topological sort에 대해서 잘 설명되어 있습니다.
ko.wikipedia.org/wiki/%EC%9C%84%EC%83%81%EC%A0%95%EB%A0%AC
위상정렬 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전.
ko.wikipedia.org
저는 아래와 같이 접근해봤습니다. (주석 참고)
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] indegree = new int[numCourses+1]; // 해당과목을 선수과목수으로 사용하는 과목의 갯수
Map<Integer, List<Integer>> map = new HashMap<>(); // 특정 과목의 선수과목 리스트
//map, indegree 초기화
for(int i=0; i<numCourses; i++) map.put(i, new ArrayList<>());
for(int i=0; i<prerequisites.length; i++) {
map.get(prerequisites[i][0]).add(prerequisites[i][1]);
indegree[prerequisites[i][1]]++;
}
//queue에 탐색할 과목을 저장함
//탐색은 indegree가 0인 과목들을 하게 됨
Queue<Integer> queue = new LinkedList<>();
for(int i=0; i<numCourses; i++) {
if(indegree[i] == 0) queue.offer(i);
}
int checkedCourses = 0;
while(!queue.isEmpty()) {
int curr = queue.poll();
//queue에 존재하는 과목들은 모두 indegree가 0인 과목임
for(int pre : map.get(curr)) { //해당 과목의 선수과목들을 다시 찾아주고
indegree[pre]--; //해당 과목을 방문한 것이라는 의미가 되므로 선수과목리스트에서 하나 빼준다.
if(indegree[pre]==0) queue.offer(pre); //만약에 해당 과목을 선수과목으로 사용하는 과목이 없으면 다시 queue에 넣어준다.
}
checkedCourses++; //이렇게 반복문 한번 할 때마다 과목을 한개씩 체크하게 됨
}
if(checkedCourses == numCourses) return true;
return false;
}
}
반응형
'SW > 알고리즘' 카테고리의 다른 글
876. Middle of the Linked List (0) | 2021.04.08 |
---|---|
[leetcode] 50. Pow(x, n) (0) | 2021.03.04 |
[leetcode] 416. Partition Equal Subset Sum (0) | 2021.03.02 |
[leetcode] 56. Merge Intervals (0) | 2021.02.28 |
[leetcode] 98. Validate Binary Search Tree (0) | 2021.02.28 |
Comments