본문 바로가기

ALGORITHM/Algorithm 설명

[알고리즘] - 위상정렬

 

Topology Sort


정렬 알고리즘의 일종인 위상정렬 알고리즘은 '순서가 정해져 있는 일련의 작업을 수행할때' 사용하는 알고리즘이다. 즉 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 정렬하는 것을 위상정렬이라고 한다. 

예를들면 선수과목을 생각하면 편하다. B라는 과목을 듣기 위해서 A라는 과목을 필수로 들어야 한다는 것과 동일하다. 즉 순서가 정해져있는 일련의 작업을 의미하게 된다. 

 

 

Toplogy Sort Algorithm


위상정렬 알고리즘은 다음 순서로 동작한다.

 - 진입차수가 0인 노드를 큐에 넣음

 - 큐가 빌때까지 다음 과정을 반복

 - 큐에서 원소를 꺼내 해당 노드에서 출발하는 간선을 그래프에서 제거

 - 새롭게 진입차수가 0이 된 노드를 큐에 넣음

 

만약 이 과정에서 모든 원소를 방문하기 전에 큐가 비게 된다면 사이클이 존재한다는 의미가 된다.

 

 

from collections import deque

def topology_sort():
    # 수행 결과를 담을 리스트
    result =[]
    q = deque()

    # 처음 시작할 때 진입차수가 0인 노드를 큐에 삽입
    for i in range(1,v+1):
        if indegree[i]==0:
            q.append(i)
    # 빌 때까지 반복
    while q:
        idx = q.popleft()
        result.append(idx)
        for i in graph[idx]:
            indegree[i]-=1
            if indegree[i]==0:
                q.append(i)

    # 위상 정렬 수행 결과 출력
    for i in result:
        print(i,end=" ")


# 노드 간선의 개수
v,e = map(int,input().split())

# 그래프 정보 리스트와 진입차수 리스트
graph=[[] for i in range(v+1)]
indegree = [0]*(v+1)

# 간선 정보 입력
for _ in range(e):
    a,b = map(int,input().split())
    graph[a].append(b)
    indegree[b]+=1

topology_sort()

 

Reference


https://ko.wikipedia.org/wiki/%EC%9C%84%EC%83%81%EC%A0%95%EB%A0%AC

 

위상정렬 - 위키백과, 우리 모두의 백과사전

위상 정렬(topological sorting)은 유향 그래프의 꼭짓점들(vertex)을 변의 방향을 거스르지 않도록 나열하는 것을 의미한다. 위상정렬을 가장 잘 설명해 줄 수 있는 예로 대학의 선수과목(prerequisite) 구

ko.wikipedia.org

https://backtony.github.io/algorithm/2020-09-09-algorithm-basics-coding-11/

 

그래프 이론 with 파이썬

Java, JPA, Spring을 주로 다루고 공유합니다.

backtony.github.io

https://katfun.tistory.com/entry/%EA%B7%B8%EB%9E%98%ED%94%84-%EC%9D%B4%EB%A1%A0

 

그래프 이론

그래프 자료구조는 코딩 테스트에서 난이도가 제법 있으면서도 어려운 부분입니다. 앞서 살펴본 DFS/BFS, 최단 경로 모두 그래프 자료구조를 활용합니다. 이 외에도 다양한 그래프 자료구조를 이

katfun.tistory.com

https://coding-factory.tistory.com/610

 

[Algorithm] 자료구조 그래프(Graph)란 무엇인가?

그래프란? 그래프는 정점과 간선으로 이루어진 자료구조입니다. 정확히는 정점(Vertex)간의 관계를 표현하는 조직도라고 볼수도 있겠습니다. 그런면에서 트리는 그래프의 일종인 셈입니다. 다만

coding-factory.tistory.com