문제 링크 : 프로그래머스 순위
백준 2458번과 동일한 문제이다.
플로이드 워샬 알고리즘을 이용해서 a가 b를 이기고 b가 c를 이겼으면 a가 c를 이기는 것으로 판단한다.
이렇게 되면 알 수 있는 모든 선수들의 대결 결과가 arr배열에 true로 저장된다.
이후에 한 선수가 모든 선수와의 대결에서 결과를 알고 있으면 answer++을 해준다.
#include <string>
#include <vector>
using namespace std;
bool arr[101][101];
int solution(int n, vector<vector<int>> results) {
int answer = 0;
for(int i=0 ; i<results.size() ; i++) {
arr[results[i][0]][results[i][1]] = true;
}
for(int k=1 ; k<=n ; k++) {
for(int i=1 ; i<=n ; i++) {
for(int j=1 ; j<=n ; j++) {
if(arr[i][k] && arr[k][j]) {
arr[i][j] = true;
}
}
}
}
for(int i=1 ; i<=n ; i++) {
int cnt=0;
for(int j=1 ; j<=n ; j++) {
if(arr[i][j] || arr[j][i]) cnt++;
}
if(cnt+1 == n) answer++;
}
return answer;
}