인프런 커뮤니티 질문&답변
위상정렬 구현 관련
해결된 질문
작성
·
15
0
package 위상정렬;
import java.util.*;
public class 위상정렬 {
public int[] topologicalSort(int nodesNum, int[][] edges) {
// 주어진 입력을 사용하기 편한 형태로 변경 -> 방향그래프로 변경
Map<Integer, List<Integer>> graph = new HashMap<>();
int[] indegree = new int[nodesNum];
// edges의 원소 [v, u]는 u -> v 의 방향을 가지 edge를 뜻한다.
for (int[] edge : edges) {
graph.putIfAbsent(edge[1], new ArrayList<>());
graph.get(edge[1]).add(edge[0]);
indegree[edge[0]]++;
}
Queue<Integer> queue = new ArrayDeque<>();
boolean[] visited = new boolean[nodesNum];
int[] order = new int[nodesNum];
// 위상정렬을 수행한다.
// indegree == 0 인 정점부터 탐색이 시작된다.
int count = 0;
for (int c = 0; c < nodesNum; c++) {
if (indegree[c] == 0) {
queue.add(c);
visited[c] = true;
order[count] = c;
count++;
}
}
while (!queue.isEmpty()) {
int cur = queue.remove();
if (graph.containsKey(cur)) {
// 해당 정점과 연결된 노드들의 진입차수에서 1빼기
for (int next : graph.get(cur)) {
indegree[next]--;
// 진입차수가 0이면 이제 방문해도 된다는 뜻이기 때문에 queue에 추가해준다.
if (indegree[next] == 0) {
visited[next] = true;
order[count] = next;
count++;
queue.add(next);
}
}
}
}
return order;
}
}
안녕하세요 ~ 위상정렬 관련해서 문의사항이 있어서요 ~ 다름이 아니라 강의의 구현 코드에서 visited를 체크를 하고 있던데 위상정렬의 경우 사이클이 없는 방향 그래프인데 visited가 필요할까요 ?? 현재 코드에서도 visited를 선언만 하고 따로 활용을 하고 있지 않은거같아서 문의 드립니다 ~
답변 2
1
안녕하세요!! 네 맞습니다. 정확하게 보셨습니당
visited가 필요없는데, 강의에서 제가 불필요하게 사용을 했네요...!
종종 트리 관련코드에서는 제가 visited를 일부로 쓰기도합니다(필요없어도) 약간 학습할떄 템플릿처럼 외우기 편하라고 그렇게 합니다.
정확하게 이해하신게 맞습니다 ㅎㅎ
0
안녕하세요, 인프런 AI 인턴입니다.
라뗴님께서 문의하신 위상정렬의 경우, 일반적으로 사이클이 없는 방향 그래프(Directed Acyclic Graph, DAG)에서 수행되는 것이 맞습니다. 말씀하신 대로, 위상정렬에서는 각 노드가 방문되었다는 별도의 visited 배열 없이도 수행할 수 있습니다. 위상정렬에서는 진입차수(indegree)를 이용해 처리하기 때문에, 주어진 코드에서는 visited 배열이 사실상 필요하지 않습니다.
visited 배열이 필요 없는 이유는, 이 코드에서는 진입차수가 0인 노드에서 시작하여 모든 노드를 방문하는 방식으로 위상정렬을 수행하기 때문입니다. 만약 그래프에 사이클이 포함되어 있다면, 마지막에 정렬이 완전히 이루어지지 않을 것이며, 이는 진입차수가 남아 있는 노드가 존재하는 것으로 확인할 수 있습니다.
그래서, 주어진 코드에서 visited 배열은 제거해도 코드 구현에는 문제가 없을 것입니다.
더 자세한 내용을 알고 싶다면, 다음의 URL에서 추가적인 논의를 참고하실 수 있습니다:
- Topological Sorting Implementation 관련 논의
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




