티스토리 뷰

반응형

https://www.acmicpc.net/problem/2252

 

2252번: 줄 세우기

첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의

www.acmicpc.net

 


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 그래프 이론
  • 위상 정렬

 


 

⊙ 문제 접근 과정

 

위상 정렬 알고리즘 문제다.

 

위상 정렬 알고리즘은 큐를 이용하여 풀 수 있다.

 

큐를 이용하여 위상 정렬 알고리즘을 푸는 과정은

 

1️⃣ 진입 차수가 0인 모든 노드를 큐에 넣는다.

2️⃣ 큐가 빌 때까지 while문을 돌린다!!

3️⃣ 반복문에서는 큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거

4️⃣ 새롭게 진입 차수가 0이 된 노드를 큐에 추가

 

 

위상 정렬에서는 여러 가지 답이 존재할 수도 있다.

스택을 활용하여 풀어주자

 


 

⊙ 문제 풀이

 

import sys
from collections import deque

input = sys.stdin.readline

N, M = map(int, input().split())
graph = [[] for _ in range(N+1)]
indegree = [0] * (N+1)

for _ in range(M):
    x, y = map(int, input().split())
    graph[x].append(y)
    indegree[y]+=1

# 위상 정렬
def topo():
    result = []
    q = deque()

    for i in range(1,N+1):
        if indegree[i]==0:
            q.append(i)

    while q:
        a = q.popleft()
        result.append(a)

        for i in graph[a]:
            indegree[i]-=1

            if indegree[i]==0:
                q.append(i)
    for i in result:
        print(i,end=' ')

topo()

 


⊙ 결과

 


⊙ 마무리

 

 

NONE

 

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함