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번은 다음글에 이어서... 부족한 글이지만 읽어주신 독자분들께 항상 감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari