기록하는삶

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2252번 _ 줄 세우기 본문

백준(Python)/그래프, 그래프탐색

[코딩 테스트 연습(파이썬/Python)] 백준(BOJ) 2252번 _ 줄 세우기

mingchin 2022. 2. 26. 01:07
728x90
반응형

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

[문제]

N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.

일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.

 

[입력]

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

학생들의 번호는 1번부터 N번이다.

[출력]

첫째 줄에 학생들을 키 순서대로 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다.

 

[아이디어]

1) 위상 정렬 그 자체다.

2) 줄을 선 학생들과 그렇지 않은 학생들을 기록해두었다가, 줄을 서지 않은 학생들을 마지막에 추가해줘야한다.

 

import sys
from collections import deque
input=sys.stdin.readline

def const(g,ans,pre,visit):
    q = deque([])
    for i,x in enumerate(pre):
        if x==0:
            q.append(i)
    while q:
        now = q.popleft()
        ans.append(now)
        visit[now] = 1
        for x in g[now]:
            pre[x] -= 1
            if pre[x]==0:
                q.append(x)
    return ans

n,m = map(int,input().split())
g = [[] for _ in range(n+1)]
pre = [None] + [0]*n
ans = []
visit = [0]*(n+1)
for _ in range(m):
    a,b = map(int, input().split())
    g[a].append(b)
    pre[b] += 1

const(g,ans,pre,visit)
for i,x in enumerate(visit[1:]):
    if x==0:
        ans.append(i+1)
print(*ans)

 

 

728x90
반응형