Post

[백준] 2458 파이썬

문제


  • 백준 2458 (골드 4)

백준 2458

학생들의 키를 비교한 결과를 통해서 전체에서 키가 몇번째인지 알 수 있는 학생의 수를 구하는 문제였다.
한달쯤 전에 풀었던 문제였는데 어떻게 접근해야될지 고민이 많았던 것이 지금까지도 기억이 났다.
입력이 최대 500이여서 시간 제한은 널널한 문제였다.

image

내 코드


두 개의 dfs 함수를 통해서 구현 가능할 것 같아 시도해보았다.
우선 처음 키를 비교한 결과를 받을 때 자신보다 큰 학생들은 big으로 작은 학생들은 small으로 나눠 받았다.
다음으로 각 학생마다 dfs_big과 dfs_small 두 가지 함수를 돌면서 자신보다 큰 학생, 자신보다 작은 학생의 수를 계산하였다.
계산된 학생의 수가 전체 학생과 같다면 결과를 하나씩 올려주었다.

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
32
33
34
35
import sys
input = sys.stdin.readline

n, m = map(int,input().split())
big = [[] for _ in range(n+1)]
small = [[] for _ in range(n+1)]
visited = [False]*(n+1)
ans = 0
for _ in range(m):
    a, b = map(int,input().split())
    big[a].append(b)
    small[b].append(a)

def dfs_big(i):
    for x in big[i]:
        if not visited[x]:
            visited[x] = True
            dfs_big(x)

def dfs_small(i):
    for x in small[i]:
        if not visited[x]:
            visited[x] = True
            dfs_small(x)

for i in range(1, n+1):
    visited = [False]*(n+1)
    visited[0] = True
    visited[i] = True
    dfs_big(i)
    dfs_small(i)
    if False not in visited:
        ans += 1 

print(ans)

image

문제 해결 후에 다른 사람들의 코드를 확인해보니 플로이드-워셜 알고리즘을 활용하여서도 해결 가능하다는 것을 알 수 있었다.
문제를 보고 플로이드-워셜 알고리즘을 바로 떠올릴 수 있도록 더 많은 문제를 풀어봐야겠다는 생각이 들었다.

This post is licensed under CC BY 4.0 by the author.