입출력 예 설명
2번 선수는 [1, 3, 4] 선수에게 패배했고 5번 선수에게 승리했기 때문에 4위입니다.
5번 선수는 4위인 2번 선수에게 패배했기 때문에 5위입니다.
접근법
k번 선수가 이긴 사람을 win, k번 선수를 이긴 사람을 lose에 넣어 각각의 딕셔너리를 생성해 줍니다. 딕셔너리가 생성되면 선수 수만큼 반복문을 돌면서 업데이트를 해줍니다. lose에 있는 사람(k번 선수를 이긴 사람들)은 k번 선수를 이겼으므로, win딕셔너리에 추가해 줍니다. 예를 들어서 3번 선수를 4번 선수가 이겼다면, win[4] = 3를 추가해 주는 것 입니다. 반대로, 2번 선수가 4번 선수에게 졌다면, lose[2] = 4를 추가해 주는 과정 또한 진행합니다. 이 과정이 끝나면 k번 선수가 몇번 선수에게 지고, 몇 번 선수에게 이겼는지 딕셔너리에 모두 저장이 됩니다. 자기 순위를 확실하게 아는 선수는 자기가 이긴 선수 + 자기가 진 선수 = 전체 인원 - 1이 성립합니다. 따라서 모든 선수에 대해 다음과 같이 계산하여 카운트 하시면 됩니다!
나의 코드
from collections import defaultdict
def solution(n, results):
answer = 0
win, lose = defaultdict(set), defaultdict(set)
for result in results:
lose[result[1]].add(result[0])
win[result[0]].add(result[1])
for i in range(1, n + 1):
for winner in lose[i]: win[winner].update(win[i])
for loser in win[i]: lose[loser].update(lose[i])
for i in range(1, n+1):
if len(win[i]) + len(lose[i]) == n - 1: answer += 1
return answer