Sort
Sort 정렬 알고리즘을 정리해놓는 공간
선택정렬(Selection Sort)
선택정렬은 인덱스를 반복하면서 인덱스 이상의 값들 중 가장 작은 값을 찾아서 인덱스와 교환하는 방식으로 정렬하는 알고리즘이다.
선택정렬은 시간복잡도가 O(N^2)
이다.
def selection_sort(arr) :
for i in range(len(arr)) :
min_index = i
# 이 루프를 수행하고나면 min_index에서 가장 작은 값의 index가 저장된다.
for j in range(i+1, len(arr)) :
if arr[min_index] > arr[j] :
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
위상정렬(Topological Sort)
위상정렬은 유향 그래프의 꼭짓점들을 변의 방향을 거스르지 않도록 나열하는 것을 의미한다.
위상 정렬은 순서가 정해져있는 작업을 차례대로 수행해야할 때 그 순서를 결정하기 위해서 사용한다.
- 위상정렬은 DAG(Directed Acyclic Graph)에만 적용이 가능하다.
- 방향이 존재하는데 싸이클(순회)가 존재하지 않는 그래프에만 적용가능
- 위상 정렬에서 시간 복잡도는
O(V+E)
이다.- V는 노드의 개수, E는 간선의 개수
구현
v, e = map(int, input().split())
# 모든 노드에 대한 집입차수를 0으로 초기화
indegree = [0] * (v + 1)
# 각 노드에 연결된 간선 정보를 담기 위한 연결 리스트 초기화
graph = [[] for _ in range(v + 1)]
# 방향 그래프의 모든 간선 정보를 입력 받기
for _ in range(e) :
a, b = map(int, input().split())
graph[a].append(b) # A에서 B로 이동가능
# 진입 차수를 1증가
indegree[b] += 1
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 :
now = q.popleft()
result.append(now)
# 해당 원소와 연결된 노드들의 진입차수에서 1 빼기
for i in graph[now] :
indegree[i] -= 1
# 새롭게 진입 차수가 0이 되는 노드를 큐에 삽입
if indegree[i] == 0 :
q.append(i)
for i in result :
print(i, end=' ')
topology_sort()
대표적인 문제
백준 1005번
https://rookedsysc.vercel.app/algorithm/baekjoon/python/1005 (opens in a new tab)
Reference
https://www.youtube.com/watch?v=qzfeVeajuyc (opens in a new tab)