https://www.acmicpc.net/problem/17616
17616번: 등수 찾기
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에 세 정수 N, M, X가 공백을 사이에 두고 주어진다. (2 ≤ N ≤ 105, 1 ≤ M ≤ min(N(N-1)/2, 5×105), 1 ≤ X ≤ N) . 다음 M 줄에는 각각 두 정수 A, B가 주어
www.acmicpc.net
그래프 탐색 문제입니다. 이 문제의 특징은 그래프를 2개를 만들어서 각각 그래프를 탐색해야한다는 것 입니다. 자기보다 잘한 사람들을 가르키고 있는 그래프(in_graph)와 자기보다 못한 사람(out_graph)을 가르키고 있는 그래프를 각각 만들고 X보다 잘한 사람을 찾기 위해 in_graph를 탐색하면 자기보다 등수가 높을 수 있는 사람의 수와 out_graph를 탐색하면 자기보다 등수가 낮을 수 있는 사람의 수가 나오게 되고 이를 통해 최대 등수와 최소 등수를 찾을 수 있습니다.
저는 BFS로 탐색했는 DFS로 탐색하면 조금 더 짧은 시간에 해결이 가능합니다.
import sys
from collections import defaultdict, deque
# sys.stdin = open("input.txt", "r")
input = sys.stdin.readline
in_graph = defaultdict(list)
out_graph = defaultdict(list)
# n: 학생의 수, m: 관계의 수, x: 등수를 알고자하는 학생
n, m, x = tuple(map(int, input().split()))
for _ in range(m):
high, low = tuple(map(int, input().split()))
# 자기보다 잘한 학생을 가르킨다.
in_graph[low].append(high)
# 자기보다 못한 학생을 가르킨다.
out_graph[high].append(low)
def bfs(start, graph):
visited = [False] * (n + 1)
visited[start] = True
q = deque([start])
cnt = -1
while q:
cur = q.popleft()
cnt += 1
for next in graph[cur]:
if not visited[next]:
visited[next] = True
q.append(next)
return cnt
# 잘한 사람을 가르키고 있는 그래프를 탐색하면서 x보다 잘한 사람들을 센다
maxRank = 1 + bfs(x, in_graph)
# 못한 사람을 가르키고 있는 그래프를 탐색하면서 x보다 못한 사람들을 센다.
minRank = n - bfs(x, out_graph)
print(maxRank, minRank)
'문제 해결 > BOJ' 카테고리의 다른 글
[백준] 일감호에 다리 놓기 (0) | 2023.02.25 |
---|---|
[백준] 문자열 폭발 (0) | 2023.02.24 |
[백준] 게리 멘더링2 (0) | 2023.02.23 |
[백준] 벽 부수고 이동하기 2 (0) | 2023.02.22 |
[백준] 감시 (0) | 2023.02.21 |