[백준] 2252번 줄 세우기 - 파이썬(Python)

2021. 11. 11. 11:57· 알고리즘/문제풀이
목차
  1. 나의 코드
  2. 코드 설명 및 풀이법
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

 

나의 코드

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

n, m = map(int, input().split())
in_degree = [0] * (n + 1)
graph = [[] for _ in range(n+1)]

for _ in range(m):
    a, b = map(int, input().split())
    in_degree[b] += 1
    graph[a].append(b)

queue = deque()
ans = []

for i in range(1, n+1):
    if in_degree[i] == 0:
        queue.append(i)

while queue:
    current = queue.popleft()
    ans.append(current)

    for x in graph[current]:
        in_degree[x] -= 1

        if in_degree[x] == 0:
            queue.append(x)

print(*ans, end=" ")

코드 설명 및 풀이법

처음엔 학생의 최소 위치를 기록해주는 느낌으로 접근했다.

 

만약에 1, 3과 2, 3이 input으로 들어온다면, 뒤에 나온 3은 무조건 1과 2보다 뒤에 있어야함으로 3의 최소 위치인 숫자 2를 기록해준다.

 

그리고 1과 2는 3보다 앞서기만 한다면 어느 곳에 위치해도 상관 없기 때문에 결국엔 [0, 0, 2] 이런 식의 기록이 나오게 된다.

 

이걸 index와 함께 정렬해서 출력해주는 방식으로 접근했는데, 만약 (1, 3), (2, 3), (3, 4), (1, 4), (2, 4), (5, 3)과 같은 숫자가 기록된다면, 각 학생의 최소 위치는 [0, 0, 3, 3, 0]이 된다.

 

이렇게 된다면, 1, 2, 5번 학생을 배열하는 것엔 아무 문제가 없겠지만 3, 4번 학생을 배열할 때 최소 위치가 같으므로 3, 4나 4, 3 모두 가능한 배열이 되어버린다.

 

즉, 앞서 나온 3이 4보다 앞선다는 조건을 위배하는 것이다.

 

조금 더 고민해보다가, 위상정렬이라는 알고리즘을 사용해서 간단히 해결할 수 있다는 걸 알게 되었다.

저작자표시 (새창열림)

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

[백준] 1766번 문제집 - 파이썬(Python)  (0) 2021.11.11
[백준] 11000번 강의실 배정 - 파이썬(Python)  (0) 2021.11.11
[백준] 1963번 소수 경로 - 파이썬 (Python)  (0) 2021.10.20
[백준] 14719번 빗물 - 파이썬(Python)  (0) 2021.10.19
[백준] 14499번 주사위 굴리기 - 파이썬(Python)  (0) 2021.10.14
  1. 나의 코드
  2. 코드 설명 및 풀이법
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준] 1766번 문제집 - 파이썬(Python)
  • [백준] 11000번 강의실 배정 - 파이썬(Python)
  • [백준] 1963번 소수 경로 - 파이썬 (Python)
  • [백준] 14719번 빗물 - 파이썬(Python)
SeongOnion
SeongOnion
서버는 꺼지지 않아요
SeongOnion
조무래기 코딩
SeongOnion
전체
오늘
어제
  • 분류 전체보기 (166)
    • 알고리즘 (81)
      • 이론 (8)
      • 문제풀이 (73)
    • 언어 (15)
      • Python (9)
      • JavaScript (1)
      • JAVA (5)
    • 데이터베이스 (5)
    • 프레임워크 (15)
      • Django (7)
      • Spring (8)
    • 그 외 공부 (37)
      • 운영체제 (1)
      • 자료구조 (14)
      • 네트워크 (5)
      • CS (2)
      • 기타 (6)
      • 트러블 슈팅 (9)
    • 프로젝트 (0)
    • 개발자취 (8)
    • 회고 (3)
    • 주저리주저리 (1)
    • 기타 (비개발) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Django
  • 장고
  • 웹
  • 에라토스테네스의 체
  • 프로그래머스
  • spring
  • 코딩
  • 정렬 알고리즘
  • 소수
  • 자바
  • 파이썬
  • 트러블 슈팅
  • 투 포인터 알고리즘
  • 브루트포스
  • 개발자
  • 백준
  • DRF
  • BFS
  • 회고
  • 코딩테스트
  • 그리디알고리즘
  • BFS/DFS
  • 데이터베이스
  • 알고리즘
  • DP
  • 이진탐색
  • 컨트리뷰트
  • 큐
  • 스택
  • 오픈소스

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeongOnion
[백준] 2252번 줄 세우기 - 파이썬(Python)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.