728x90
▶2252 - 줄 세우기
▶문제
N명의 학생들을 키 순서대로 줄을 세우려고 한다. 각 학생의 키를 직접 재서 정렬하면 간단하겠지만, 마땅한 방법이 없어서 두 학생의 키를 비교하는 방법을 사용하기로 하였다. 그나마도 모든 학생들을 다 비교해 본 것이 아니고, 일부 학생들의 키만을 비교해 보았다.
일부 학생들의 키를 비교한 결과가 주어졌을 때, 줄을 세우는 프로그램을 작성하시오.
▶입력
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 횟수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의미이다.
학생들의 번호는 1번부터 N번이다.
▶출력
첫째 줄에 학생들을 앞에서부터 줄을 세운 결과를 출력한다. 답이 여러 가지인 경우에는 아무거나 출력한다.
▶예제
▶풀이
고급 문제 해결 시간에 과제로 나왔던 문제이다. (8장 3번 문제)
pre라는 a 뒤에 따라오는 b들과 num이라는 b를 하기 위한 숫자를 만들었다.
예를 들어 b는 a가 오고 나서 줄을 설 수 있다.
그럼 pre[a]에 b가 들어가고, num[b]에는 1이 추가되는 식이다.
num이 0일 때는 앞에 오는 애가 없기 때문에 바로 answer에 추가해주면 된다.
그리고 a가 왔을 때 따라오는 애들을 찾아보고 num을 1 줄인 후 0이 된다면 따라오는 애도 줄을 세운다.
def topological(numCourses, prerequisites):
pre = [[]for _ in range(numCourses)]
num = [0 for _ in range(numCourses)]
queue = []
answer = []
for a, b in prerequisites:
pre[b].append(a)
num[a] += 1
for i in range(numCourses):
if num[i] == 0:
queue.append(i)
while queue:
course = queue.pop()
answer.append(course)
for crs in pre[course]:
num[crs] -= 1
if num[crs] == 0:
queue.append(crs)
if len(answer) == numCourses:
return answer
return -1
n, m = map(int, input().split())
c = []
for i in range(m):
a, b = map(int, input().split())
c.append([b-1, a-1])
result = topological(n, c)
for re in result:
print(re + 1, end=' ')
드디어 플래티넘 달성했다... 기째기째
728x90
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold5 - 11000번 강의실 배정 (Python) (0) | 2022.11.28 |
---|---|
[백준/BOJ] gold5 - 1038번 감소하는 수 (Python) (0) | 2022.11.28 |
[백준/BOJ] gold2 - 16946번 벽 부수고 이동하기 4 (Python) (0) | 2022.07.11 |
[백준/BOJ] gold3 - 2143번 두 배열의 합 (Python) (0) | 2022.07.10 |
[백준/BOJ] gold4 - 1987번 알파벳 (Python) (0) | 2022.07.09 |