본문 바로가기
정보처리기사 자격증/3과목 알고리즘

정보처리기사 위상 정렬 완벽 마스터하기: 개념부터 실전까지

by 길잡이마롱 2024. 11. 21.

정보처리기사 시험 준비 중인 여러분, 혹시 위상 정렬이라는 용어 들어보셨나요? 알고리즘 문제 풀이에서 꽤 자주 등장하는 개념이라 익숙해지는 게 좋을 거예요. 이 글에서는 위상 정렬의 개념을 쉽고 명확하게 설명하고, 실제 문제에 어떻게 적용하는지 알려드릴게요. 심지어 정보처리기사 시험에 나올 만한 유형까지 꼼꼼하게 짚어드리니까, 끝까지 집중해서 읽어보세요! 후회하지 않으실 거예요!

 


위상 정렬(Topological Sort): 도대체 뭔가요?

위상 정렬, 이름부터 좀 어렵죠? 하지만 개념 자체는 생각보다 간단해요. 쉽게 설명하면, 서로 순서가 정해져 있는 일들을 차례대로 수행하는 방법을 찾는 알고리즘이라고 생각하시면 돼요. 마치 레고 조립 설명서처럼, 특정 부품을 먼저 조립해야만 다음 부품을 조립할 수 있는 상황 말이에요. 이때, 모든 부품을 제대로 조립하기 위한 순서를 찾는 것이 바로 위상 정렬의 핵심이랍니다.

 

이러한 작업 순서를 나타내는 데 사용하는 도구가 바로 유향 비순환 그래프(Directed Acyclic Graph, DAG)입니다. DAG는 정점(노드)과 간선(에지)으로 이루어진 그래프인데, 간선은 방향을 가지고 있으며, 어떤 정점에서 출발해서 다시 그 정점으로 돌아오는 사이클이 없다는 특징이 있어요. 마치 일방통행 도로처럼, 한 방향으로만 이동이 가능한 거죠. 만약 사이클이 있다면, 위상 정렬은 불가능해요. 왜냐하면, 어떤 작업이 다른 작업을 기다려야 하는지 순서를 정할 수 없기 때문이에요.

 

그럼, 위상 정렬을 좀 더 엄밀하게 정의해 볼까요? 위상 정렬은 DAG의 모든 간선 (u, v)에 대해, 정점 u가 정점 v보다 항상 앞서 나타나는 순서로 정점들을 나열하는 겁니다. 즉, 만약 u에서 v로 가는 간선이 있다면, 위상 정렬 결과에서 u는 항상 v보다 앞에 위치해야 해요. 이렇게 정렬된 순서를 위상 순서(Topological Order)라고 부르고요.

 

어려운 개념 설명은 그만하고, 간단한 예시를 하나 들어볼게요. 대학교 수업을 생각해 봅시다. '선형대수'를 수강하려면 '미적분'을 먼저 들어야 한다면, '미적분'이 '선형대수'보다 위상 정렬 결과에서 앞에 나와야겠죠? 이처럼 위상 정렬은 여러 가지 작업이나 과정이 서로 의존적인 관계에 있을 때, 작업 순서를 결정하는 데 매우 유용하게 사용됩니다. 정보처리기사 시험에서도 이런 원리를 활용하는 문제들이 꽤 자주 출제되고 있으니, 꼭 숙지해두시는 게 좋습니다.

 

사실, DAG가 아닌 일반적인 방향 그래프에서는 위상 정렬이 항상 가능한 건 아니에요. 만약 그래프에 사이클이 있다면, 어떤 정점을 먼저 배치해야 할지 결정할 수 없어서 위상 정렬을 할 수 없게 되거든요. 그래서 위상 정렬 문제를 풀 때는 먼저 그래프에 사이클이 있는지 확인하는 것이 중요합니다. 사이클이 없다면, 여러 가지 위상 정렬 결과가 존재할 수 있지만, 적어도 하나의 위상 정렬은 반드시 존재한다는 사실을 기억해 두세요!

 


위상 정렬 알고리즘: BFS(너비 우선 탐색) 방법

위상 정렬을 구현하는 방법은 여러 가지가 있지만, 가장 널리 사용되는 방법 중 하나가 바로 BFS(Breadth-First Search)를 이용하는 방법입니다. BFS는 그래프의 정점들을 너비 방향으로 탐색하는 알고리즘인데, 위상 정렬에서는 **진입 차수(In-degree)**라는 개념과 함께 사용됩니다.

 


진입 차수(In-degree)란 무엇일까요?

진입 차수는 특정 정점으로 들어오는 간선의 개수를 말해요. 예를 들어, A → B, C → B 라는 간선이 있다면, 정점 B의 진입 차수는 2가 되는 거죠. BFS 기반 위상 정렬 알고리즘은 진입 차수가 0인 정점부터 처리해 나가는 방식으로 동작합니다. 왜냐하면, 진입 차수가 0이라는 것은 그 정점으로 들어오는 간선이 없다는 것을 의미하니까, 즉, 아무런 선행 조건 없이 작업을 시작할 수 있는 정점이라는 뜻이죠.

 


BFS 알고리즘 구현 단계

  • 진입 차수 계산: 먼저, 그래프의 모든 정점에 대해 진입 차수를 계산합니다.
  • 큐 초기화: 진입 차수가 0인 모든 정점들을 큐에 삽입합니다.
  • 큐 처리: 큐가 비어있지 않다면, 큐에서 하나의 정점을 꺼내 위상 정렬 결과에 추가합니다.
  • 간선 제거: 꺼낸 정점에서 나가는 모든 간선을 제거합니다. 이 과정에서 연결된 정점들의 진입 차수가 감소하게 되겠죠.
  • 진입 차수 0인 정점 큐에 추가: 진입 차수가 0이 된 정점이 있다면, 그 정점들을 큐에 삽입합니다.
  • 반복: 3~5번 과정을 큐가 비워질 때까지 반복합니다.

이렇게 하면, 큐에서 꺼낸 정점들의 순서대로 위상 정렬 결과를 얻을 수 있어요. BFS 알고리즘의 시간 복잡도는 O(V + E)로, V는 정점의 개수, E는 간선의 개수를 의미해요. 꽤 효율적인 알고리즘이라고 할 수 있겠죠? 물론, 코드로 구현해 보면서 직접 확인해 보는 게 더욱 확실하게 이해하는 방법이겠죠!

 


위상 정렬 알고리즘: DFS(깊이 우선 탐색) 방법

BFS 외에도 위상 정렬을 구현하는 또 다른 방법으로 DFS(Depth-First Search)를 사용할 수 있습니다. DFS는 그래프의 정점들을 깊이 방향으로 탐색하는 알고리즘인데, 위상 정렬에서는 정점 방문 순서를 기록하는 스택을 함께 사용합니다.

 


DFS 알고리즘 구현 단계

  • 방문 상태 관리: 각 정점의 방문 상태를 관리하기 위한 배열을 만듭니다. (방문 전, 방문 중, 방문 완료)
  • DFS 수행: 모든 정점을 순회하며 방문하지 않은 정점에 대해 DFS를 수행합니다.
  • 방문 중 상태: DFS를 수행하는 동안, 방문 중인 정점은 스택에 넣어둡니다.
  • 방문 완료: DFS가 끝난 정점은 스택에서 팝(pop)합니다.
  • 위상 정렬 결과: 스택에 남아 있는 정점들을 꺼내면, 그 순서가 위상 정렬 결과가 됩니다.

DFS를 이용한 위상 정렬 알고리즘 역시 시간 복잡도가 O(V + E)입니다. BFS와 비슷한 효율을 가지지만, 구현 방식이 조금 다르기 때문에, 개인의 선호도에 따라 선택하여 사용할 수 있습니다. 두 가지 방법 모두 장단점이 있기 때문에, 문제 상황에 맞게 적절한 알고리즘을 선택하는 것이 중요하겠죠?

 


실전 예시: 정보처리기사 시험 문제 유형

자, 이제 위상 정렬의 개념을 실제 문제에 적용해 볼까요? 정보처리기사 시험에서는 위상 정렬 개념을 이용한 다양한 문제들이 출제됩니다. 예를 들어, 여러 가지 작업들의 선행 조건이 주어지고, 이 작업들을 순서대로 수행하는 방법을 찾는 문제가 있을 수 있죠. 또는 그래프가 그림으로 제시되고, 그 그래프의 위상 정렬 결과를 찾는 문제도 자주 출제됩니다.

 


이런 문제를 푸는 핵심은 다음과 같습니다.

 

  • 그래프 구성: 주어진 정보를 바탕으로 DAG를 구성합니다. 각 작업을 정점으로, 작업 간의 선행 조건을 간선으로 표현하는 것이죠.
  • 사이클 검출: 구성한 그래프에 사이클이 있는지 확인합니다. 사이클이 있다면 위상 정렬이 불가능하다는 것을 기억하세요!
  • 알고리즘 적용: BFS 또는 DFS 알고리즘을 적용하여 위상 정렬을 수행합니다.
  • 결과 확인: 위상 정렬 결과가 주어진 선행 조건을 모두 만족하는지 확인합니다.

표 형식

BFS 너비 우선 탐색 O(V+E) 구현이 간단  
DFS 깊이 우선 탐색 O(V+E) 사이클 검출 용이 재귀 호출에 따른 스택 오버플로우 가능성

알고리즘 설명 시간복잡도 장점 단점

 


QnA 섹션

Q1. 위상 정렬은 왜 중요한가요?

A1. 위상 정렬은 서로 의존적인 작업들을 순서대로 처리해야 하는 상황에서 매우 중요해요, 작업 순서를 잘못 정하면 작업이 진행되지 않거나 오류가 발생할 수 있기 때문에, 위상 정렬을 통해 작업 순서를 체계적으로 관리하는 것은 필수적입니다, 정보처리기사 시험에서도 이러한 개념을 바탕으로 한 문제들이 출제되기 때문에, 위상 정렬을 잘 이해하고 있는 것은 시험 합격에 큰 도움이 될 거예요.

 

Q2. 위상 정렬 알고리즘은 어떤 경우에 사용할 수 있나요?

A2. 위상 정렬 알고리즘은 사이클이 없는 방향 그래프(DAG)에만 적용할 수 있습니다, 만약 그래프에 사이클이 있다면, 위상 정렬을 수행할 수 없어요, 따라서 위상 정렬 알고리즘을 사용하기 전에 반드시 그래프에 사이클이 없는지 확인하는 것이 중요합니다, 정보처리기사 시험 문제를 풀 때도 마찬가지로, 문제에서 주어진 그래프가 DAG인지 확인하는 것을 잊지 마세요!

 

Q3. BFS와 DFS 기반 위상 정렬 알고리즘의 차이점은 무엇인가요?

A3. BFS와 DFS 기반 위상 정렬 알고리즘은 모두 O(V+E)의 시간 복잡도를 가지지만, 그래프 탐색 방식이 다릅니다, BFS는 너비 우선으로 탐색하여 진입 차수가 0인 정점부터 처리하는 반면, DFS는 깊이 우선으로 탐색하여 재귀 호출의 종료 순서를 이용하여 위상 정렬을 수행합니다, 어떤 알고리즘을 선택할지는 개인의 선호도와 문제 상황에 따라 결정할 수 있습니다, 하지만 두 알고리즘 모두 위상 정렬을 구현하는 데 유용하게 사용될 수 있다는 것을 기억하세요!

 

마무리

이제 위상 정렬에 대한 이해가 좀 더 깊어지셨나요?, 정보처리기사 시험 준비에 도움이 되었으면 좋겠네요, 다음에도 유익한 정보로 찾아뵙겠습니다.