728x90
반응형
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
문제 해결
- DFS로 내 앞에 최소 몇명이 있는지 구하고, 내 뒤에 최소 몇명이 있는지 쉽게 구할 수 있다.
- 최고 등수는 한 명도 앞에 없을 때 1등이라 하고 앞에 있는 사람의 명수가 늘어날 때마다 1씩 더해준다.
- 최저 등수는 꼴등이라 가정하고 뒤에 한 명씩 단서가 생길 때마다 1씩 빼주며 등수를 구한다.
- 함께 구하는 방법은 생각하지 못했다.
- DFS를 두 번 사용해서 pypy3로는 통과했는데 python3는 만점을 받지 못했다.
CODE
import sys
input = sys.stdin.readline
def up(num):
if len(upstream[num]) ==0:
return
for i in range(len(upstream[num])):
if visited_up[upstream[num][i]] ==0:
visited_up[upstream[num][i]] = 1
ans[0] += 1
up(upstream[num][i])
def down(num):
if len(downstream[num])==0:
return
for i in range(len(downstream[num])):
if visited_down[downstream[num][i]] == 0:
visited_down[downstream[num][i]] = 1
ans[1] -=1
down(downstream[num][i])
if __name__=='__main__':
n, m, x = map(int ,input().split())
upstream = [[] for _ in range(n+1)]
downstream = [[] for _ in range(n+1)]
for _ in range(m):
a, b= map(int ,input().split())
upstream[b].append(a)
downstream[a].append(b)
visited_up = [0 for _ in range(n+1)]
ans = [1,n] # 최고등수, 최저등수
visited_up[x] = 1
up(x)
visited_down = [0 for _ in range(n+1)]
visited_down[x] = 1
down(x)
print(*ans)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 17386 선분 교차 1 (0) | 2023.08.25 |
---|---|
[python] 백준 19583 싸이버개강총회 (0) | 2023.08.21 |
[python] 백준 5615 아파트 임대 (0) | 2023.07.31 |
[python] 백준 23288 주사위 굴리기2 (0) | 2023.07.16 |
[python] 백준 1431 시리얼 번호 (0) | 2023.07.11 |
댓글