@@ -149,3 +149,71 @@ return len(ans) == n
149
149
```
150
150
151
151
false를 반환했다는 것은 이건 주어진 prerequisite(선수 과목)에 오류(순환)가 있다는 뜻이다.
152
+
153
+ ## java로 다시 풀기 (24.06.30)
154
+
155
+ ``` java
156
+ public class Solution {
157
+ public boolean canFinish (int numCourses , int [][] prerequisites ) {
158
+ if (prerequisites. length == 0 ) {
159
+ return true ;
160
+ }
161
+
162
+ Map<Integer , Node > vertexMap = new HashMap<> ();
163
+ for (int [] prerequisite : prerequisites) {
164
+ vertexMap. putIfAbsent(prerequisite[0 ], new Node (prerequisite[0 ]));
165
+ vertexMap. putIfAbsent(prerequisite[1 ], new Node (prerequisite[1 ]));
166
+
167
+ Node vertex1 = vertexMap. get(prerequisite[0 ]);
168
+ Node vertex2 = vertexMap. get(prerequisite[1 ]);
169
+
170
+ vertex1. edges. add(vertex2);
171
+ vertex2. reversedEdges. add(vertex1);
172
+ }
173
+
174
+ Deque<Integer > deque = new LinkedList<> ();
175
+
176
+ int [] degrees = new int [numCourses];
177
+ for (int i = 0 ; i < degrees. length; i++ ) {
178
+ Node vertex = vertexMap. get(i);
179
+ if (vertex != null ) {
180
+ degrees[i] = vertex. edges. size();
181
+ if (degrees[i] == 0 ) {
182
+ deque. addLast(i);
183
+ }
184
+ }
185
+ }
186
+
187
+ while (! deque. isEmpty()) {
188
+ int vertexId = deque. removeFirst();
189
+ Node vertex = vertexMap. get(vertexId);
190
+ for (Node node : vertex. reversedEdges) {
191
+ degrees[node. id]-- ;
192
+ if (degrees[node. id] == 0 ) {
193
+ deque. addLast(node. id);
194
+ }
195
+ }
196
+ vertexMap. remove(vertexId);
197
+ }
198
+
199
+ return vertexMap. isEmpty();
200
+ }
201
+ }
202
+
203
+ class Node {
204
+ int id;
205
+ List<Node > edges;
206
+ List<Node > reversedEdges;
207
+
208
+ public Node (int id ) {
209
+ this . id = id;
210
+ edges = new ArrayList<> ();
211
+ reversedEdges = new ArrayList<> ();
212
+ }
213
+ }
214
+ ```
215
+
216
+ ### TC, SC
217
+
218
+ node(vertex)의 수를 ` V ` , edge의 수를 ` E ` 라고 하였을 때
219
+ 시간 복잡도는 ` O(V + E) ` 이다. 공간 복잡도는 ` O(V + E) ` 이다.
0 commit comments