(Graph) Course Schedule
17 Dec 2020 | algorithm programming leetcode수업 시간표를 짜는 문제. 그래프로 엣지들을 그려보면 사이클을 찾는 문제이다. DFS로 검사하며 사이클을 찾았다.
import java.util.ArrayList; import java.util.List; class Solution { List<Edge> visited = new ArrayList<>(); class Edge { List<Integer> inList = new ArrayList<>(); List<Integer> outList = new ArrayList<>(); public void addIn(Integer in) { inList.add(in); } public void addOut(Integer out) { outList.add(out); } } // 4. cycle이 있는지 찾는다 private boolean traverse(Edge[] edges, Edge edge, List<Edge> stack) { if (stack.contains(edge)) { return true; } if (!visited.contains(edge)) { visited.add(edge); } else { return false; } for (int i = 0; i < edge.outList.size(); i++) { stack.add(edge); if (traverse(edges, edges[edge.outList.get(i)], stack)) { return true; } stack.remove(edge); } return false; } public boolean canFinish(int numCourses, int[][] prerequisites) { boolean result = true; // 1. edge List를 만든다 Edge[] edges = new Edge[numCourses + 1]; if (prerequisites.length == 0 || prerequisites[0].length == 0) { return true; } // second -> first for (int i = 0; i < prerequisites.length; i++) { int first = prerequisites[i][0]; int second = prerequisites[i][1]; // NPE check if (edges[second] == null) { edges[second] = new Edge(); } if (edges[first] == null) { edges[first] = new Edge(); } edges[second].addOut(first); edges[first].addIn(first); } for (int i = 0; i < edges.length; i++) { if (edges[i] == null) { continue; } // 3. leaf들을 dfs한다 boolean isCycleDetected = traverse(edges, edges[i], new ArrayList<>()); if (isCycleDetected) { result = false; break; } } return result; } }