brunch

You can make anything
by writing

C.S.Lewis

by 코드아키택트 Jul 11. 2024

Problem Session 6 -1부

10분만이라도 하자

안녕하세요, 코드 아키텍트입니다. 오늘은 위상 정렬 문제를 풀어보겠습니다. 하루에 10분이라도 시간을 내어 꾸준히 글을 쓰고자 합니다. 완벽하지 않을 수 있지만, 그래도 해보겠습니다.


문제 설명

음 문제가 이렇습니다. 위상정렬(Topological Sort)에 대해 다루는 이야기입니다. 문제에서 하라는 것은 이렇습니다.


주어진 방향 그래프(Directed Graph) G에 대해 다음 질문에 답하십시오:  

(a) G의 위상 정렬을 제시하고, G의 서로 다른 위상 정렬의 수를 정당화하십시오.

(b) G에 단일 방향 간선을 추가하여 위상 정렬이 불가능한 단순 그래프를 구성하는 간선을 제시하고, 그러한 간선의 수를 정당화하십시오.

자 그럼 GPT와 함께하는 문제 풀이 시작하겠습니다.


왜 혼자 안 풀어?

핑계 없는 무덤은 없습니다. 사실 제가 알기론 이 과제는 혼자 하는 게 아니고 팀을 이뤄서 하는 것으로 알고 있습니다. 제가 완벽하게 알고 있다면 혼자 풀겠지만, 쉽지 않네요. 그래서 훌륭한 선생에게 문답하며 문제를 풀어보았습니다. 참고로 해설은 사이트에 가면 있습니다. 그러므로 GPT와 한 내용은 어쩌면 틀릴지도 모릅니다. 그래도 일단 풀어보는 연습이라 생각하고 적습니다.


위상정렬은 DFS

위상 정렬은 DFS(깊이 우선 탐색)를 통해 구할 수 있습니다. DFS를 실행한 후 역순으로 노드를 나열하면 위상 정렬을 얻을 수 있습니다. 어떤 노드를 최초 노드로 선택할지 막막할 수 있습니다. 이 문제를 해결하는 흐름을 GPT가 알려주었습니다.


1. Degree를 파악해야 한다.

위 문제에서 우리 사람 눈에는 얼핏 최초 노드로 쓸만한 애들이 보입니다. 왠지 모르게 5는 안될 거 같습니다. 이유는 이 노드가 바깥을 가리키는 게 없기 때문입니다. 직관은 그런데, 그럼 정말 시작 노드가 되려면 어떤 것을 골라야 할까요? 바로 indegree를 구해야 합니다.


먼저 각 노드의 in-degree(들어오는 간선 수)를 계산해야 합니다. in-degree가 0인 노드가 최초 노드가 됩니다. 예를 들어, 다음과 같습니다:

0: 1 (노드: 2)

1: 2 (노드: 2, 4)

2: 1 (노드: 4)

3: 1 (노드: 0)

4: 0

5: 1 (노드: 0)


이렇게 됩니다. in-degree가 0인 노드는 4입니다. 따라서 4를 기준으로 DFS를 실행합니다.


2번은 다음글에 이어서... 부족한 글이지만 읽어주신 독자분들께 항상 감사합니다.

이전 05화 NetworkX 라이브러리와 Weighted Graph
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari