Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 항해99솔직후기 #항해99 #부트캠프추천
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- 스파르타코딩클럽 #크롤링 #스크래핑
Archives
- Today
- Total
이모저모
위상정렬(topological sorting) 본문
import collections
orders = [
[1, 4],
[5, 4],
[4, 3],
[2, 5],
[2, 3],
[6, 2]
]
# 진입차수를 기록할 1차원 배열 마련 및 초기값 채우기
degree = [0] * len(orders)
for order in orders:
degree[order[1]-1] += 1
# 진입차수 0이지만 이미 큐에 넣어서 처리한 아이들 중복 처리 안하도록
checked = [0] * len(orders)
# 진입차수가 0이 된 아이들을 순서대로 처리하기 위한 que
que = collections.deque()
for i, each in enumerate(degree):
if each == 0:
que.append(i+1)
checked[i] = 1
# 순서대로 작업 출력할 리스트
res = []
while que:
# 0이어서 들어와 있던 작업 꺼내서 처리
prev = que.popleft()
res.append(prev)
# 방금 꺼낸 아이를 선행조건으로 갖고 있던 아이들의 차수 -= 1
for order in orders:
if order[0] == prev:
degree[order[1]-1] -= 1
# 이미 처리했던 아이들이 아니라면, 차수가 0이 된 아이들은 que 에 넣어주고, check 표시도 해준다.
for i, each in enumerate(checked):
if each == 0 and degree[i] == 0:
que.append(i+1)
checked[i] = 1
# 결과 출력
print(res)
'coding > 알고리즘,자료구조' 카테고리의 다른 글
heap 다루기 연습 - 이중우선순위큐(프로그래머스) (0) | 2022.02.03 |
---|---|
다익스트라(Dijkstra) 최단경로 _이코테, 프로그래머스(가장 먼 노드) (0) | 2022.02.02 |
플로이드 와샬 - 회장 뽑기 문제 (0) | 2022.02.01 |
플로이드-와샬 _ 그래프 최단거리 (0) | 2022.02.01 |
knapsack 연습 - 최대점수 구하기 (0) | 2022.02.01 |
Comments