알고리즘 PS/Graph

프로그래머스 - 순위 (플로이드 워셜 이용)

explorer999 2024. 6. 14. 12:00

코딩테스트 연습 - 순위 | Programmers School

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

나의 풀이

def solution(n, results):
    graph = [[0]*(n+1)for _ in range(n+1)]
    for res in results:
        win, lose = res[0], res[1]
        graph[win][lose] = 1
        graph[lose][win] = -1

    for i in range(n+1):
        for j in range(n+1):
            for k in range(n+1):
                if graph[i][j] == -1 and graph[j][k] == -1:
                    graph[i][k] = -1
                    graph[k][i] = 1
                elif graph[i][j] == 1 and graph[j][k] == 1:
                    graph[i][k] = 1
                    graph[k][i] = -1
                        
    answer = 0  
    
    for player in graph:
        if player.count(0)==2:
            answer+=1
        
    return answer

 

a가 b를 이기고 b가 c를 이겼다면,
a는 c를 이긴 것이고

c는 a에게 진 것이다.


--> for문을 세 개 도는 플로이드 워셜 알고리즘 이용


처음에 "c는 a에게 진 것이다!" 라는 부분을 코드에 표현하지 않아서
몇 개의 테스트케이스에서 부적확한 결과가 나왔다.


간접적인 승패의 결과를 전파할 때. 나의 풀이에서는 이김 = 1, 짐 = -1로 표현하고 

최종적으로 승패를 알 수 없는 0의 개수를 세서 답을 구했기 때문이다.


만약 진 것은 표현하지 않기로 했다면?


마지막에 1의 숫자를 셀 때 해당 인덱스를 행으로 하는 곳에서도 세고, 해당 인덱스를 열로 하는 곳에서도 세면 된다.
(열로 봤을 때 1로 표현된 것은 그 행의 인덱스를 가진 선수에게 졌기 때문임)