새로운 블로그로 이전 작업을 진행하고 있어 포스트가 새로 작성되고 있지 않습니다.

빠른 시일 내에 새로운 블로그로 인사드리겠습니다.

새로운 블로그 : https://unho.vercel.app/

본문 바로가기
알고리즘 문제풀이/Python

[백준] 2252 줄 세우기

by 언호 2022. 4. 20.

📖 문제


🧑🏻‍💻 풀이 과정

1) 문제 이해 및 접근

학생들의 절대적인 키가 아닌 상대적인 키를 입력으로 받고 있습니다.

이러한 경우 한 학생을 기준으로 그 학생보다 크거나 작은 학생들의 목록만 알아낼 수 있습니다.

 

위상 정렬 알고리즘을 이용하여, 한 학생보다 키가 작은 모든 학생들을 줄을 세우고나면 해당 학생을 줄을 세우는 방식으로 접근하였습니다.

2) 알고리즘

  • 위상 정렬

3) 풀이 코드

사용 언어 - Python

import sys
from collections import deque
sys.stdin = open('input.txt')

N, M = map(int, sys.stdin.readline().split())           # 학생의 수, 키를 비교한 횟수
linked = [[] for _ in range(N+1)]                       # 각 학생들의 본인보다 키 큰 학생의 목록
need = [0] * (N+1)                                      # 각 학생들의 본인보다 키 작은 학생의 수
answer = []                                             # 정답

for _ in range(M):
    a, b = map(int, sys.stdin.readline().split())       
    linked[a].append(b)                                 # 키 작은 학생 기준, 키 큰 학생 이름 기록
    need[b] += 1                                        # 키 큰 학생 기준으로 키 작은 학생 수 추가

q = deque()                             # 줄 서야하는 명단     
for i in range(1, N+1):
    if not need[i]:                     # 학생들을 한번씩 확인하여 키가 작아서
        q.append(i)                     # 가장 앞에 나와야 하는 모든 학생들 추가

while q:                                # 학생들이 아직 줄을 서지 않았다면
    node = q.popleft()

    for next in linked[node]:           # 현재 학생보다 키가 큰 학생들은
        need[next] -= 1                 # 키 작은 학생의 수 하나씩 뺌
        if need[next] <= 0:             # 키 큰 학생의 앞에 있는 키 작은 학생들이 모두 줄을 섰으면 줄서는 명단에 추가
            q.append(next)
    
    answer.append(node)                 # 현재 학생 줄 세우기

print(*answer)

📝 결과 및 학습한 내용

1) 어려웠던 내용

특별히 없습니다.

2) 새롭게 학습한 내용

특별히 없습니다.


🔗 문제 링크

- 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

 

 

※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다

'알고리즘 문제풀이 > Python' 카테고리의 다른 글

[백준] 17144 미세먼지 안녕!  (0) 2022.04.22
[백준] 2638 치즈  (0) 2022.04.21
[백준] 12852 1로 만들기 2  (0) 2022.04.19
[백준] 1005 ACM Craft  (0) 2022.04.16
[백준] 20040 사이클 게임  (0) 2022.04.15

댓글