Algorithm/(Java) PS

[Programmers] 순위

noahkim_ 2023. 9. 29. 16:12

난이도 : Level 3

문제링크

  • n명의 권투선수가 대회에 참가하였다
  • 1대1 방식으로 진행되며 승패 정보가 주어진다
    • 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다
    • A선수가 B선수보다 실력이 좋다면 A선수는 B선수를 항상 이깁니다
  • 몇몇 경기가 분실되어 정확하게 순위를 매길 수 없습니다
  • 정확하게 순위를 매길 수 있는 선수의 수를 리턴하라

 

해설

1. 플로이드-워셜 알고리즘을 활용한 모든 선수들의 승패 배열 생성하기

boolean[][] graph = new boolean[n][n];

for (int i = 0; i < results.length; i++) {
    graph[results[i][0]-1][results[i][1]-1] = true;
}

for (int k = 0; k < n; k++) {            
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (graph[i][k] && graph[k][j]) graph[i][j] = true;
        }
    }
}
  • graph[i][j] : i가 j를 이겼을 경우 true
  • 플로이드-워셜 알고리즘을 사용하여 승패배열 생성하기
    • if (graph[i][k] &&graph[k][j]) graph[i][j] = true;
    • i가 k를 이기고, k가 j를 이겼다면 i는 j를 이긴다.
    • A선수가 B선수보다 실력이 좋다면 A선수는 B선수를 항상 이기기 때문

 

2. 경기를 모두 치른 선수 구하기

for (int i = 0; i < n; i++) {
    int count = 0;
    for (int j = 0; j < n; j++) {
        if (graph[i][j] || graph[j][i]) count++;
    }
    if (count == n-1) answer++;
}
  • 승패 배열을 탐색하면서 i라는 선수가 자신이 치러야 할 모든 경기를 소화하였는지 이기고 졌던 횟수를 카운트하여 확인한다.

 

 

블로그 참고

 

'Algorithm > (Java) PS' 카테고리의 다른 글

[Programmers] 이중우선순위큐  (0) 2023.10.01
[Programmers] 디스크 컨트롤러  (0) 2023.09.30
[Programmers] 가장 먼 노드  (0) 2023.09.29
[Programmers] 징검다리  (0) 2023.09.28
[Programmers] 입국심사  (0) 2023.09.28