문제 설명
n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.
선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항- 선수의 수는 1명 이상 100명 이하입니다.
- 경기 결과는 1개 이상 4,500개 이하입니다.
- results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다.
- 모든 경기 결과에는 모순이 없습니다
구현해야할 조건
순위라는 것은 누가 누구를 이겼을때, 그 사이에 있는 순번을 구할 수 있어야 한다. 그렇단 얘기는 경유를 통해서 순위를 구할 수 있다는 의미가 된다. 경유를 통해서 구할수 있는 알고리즘인 floyd를 사용하자!
code
#include <string>
#include <vector>
#include <iostream>
#define MAX 101
#define INF 987654321
using namespace std;
int graph[MAX][MAX];
int solution(int n, vector<vector<int>> results) {
int answer = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
graph[i][j] = INF;
}
}
for(auto &r : results){
graph[r[0]][r[1]] = 1;
graph[r[1]][r[0]] = -1;
}
for(int via = 1; via <= n; via++){
for(int from = 1; from <= n; from++){
for(int to = 1; to <= n; to++){
if(graph[from][to] == INF){
if(graph[from][via] == 1 && graph[via][to] == 1)
graph[from][to] = 1;
else if(graph[from][via] == -1 && graph[via][to] == -1)
graph[from][to] = -1;
}
}
}
}
for(int i = 1; i <= n; i++){
bool chk = false;
for(int j = 1; j <= n; j++){
if(i == j)
continue;
if(graph[i][j] == INF)
{
chk = true;
break;
}
}
if(!chk)
answer += 1;
}
return answer;
}
'PS > Programmers' 카테고리의 다른 글
[Lv.3] 보석쇼핑 (0) | 2022.03.21 |
---|---|
[Lv.3] 다단계 칫솔 판매 (0) | 2022.03.21 |
[Lv.3] 네트워크 (0) | 2022.03.16 |
[Lv.3] 정수 삼각형 (0) | 2022.03.16 |
[Lv.3] 가장 먼 노드 (1) | 2022.03.16 |