Lv3 프로그래머스(Programmers)[Python][파이썬] 순위

"""
출처:프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/49191
"""

# 풀이 과정
from collections import defaultdict
from collections import deque


def solution(n, results):
rank_win = defaultdict(set)
rank_lose = defaultdict(set)

for win, lose in results:
rank_win[win].add(lose)
rank_lose[lose].add(win)

# 이긴 플레이 경로 재구성
for player in range(1, n + 1):
visit = [False] * (n + 1)
visit[0] = True
visit[player] = True

q = deque([player])

while q:
opponent = q.popleft()
visit[opponent] = True

for i in rank_win[opponent]:
if visit[i] == False:
q.append(i)
rank_win[player].add(i)

# 진 플레이들 재구성
for player in range(1, n + 1):
visit = [False] * (n + 1)
visit[0] = True
visit[player] = True

q = deque([player])

while q:
opponent = q.popleft()
visit[opponent] = True

for i in rank_lose[opponent]:
if visit[i] == False:
q.append(i)
rank_lose[player].add(i)

# 결과를 알 수 있는 플레이를 검색
answer = 0

for player in range(1, n + 1):
if len(rank_win[player] | rank_lose[player]) == n - 1:
answer += 1

return answer