본문 바로가기

PS/Programmers

[Lv.3] 순위

문제 설명

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