[프로그래머스] 순위 (플로이드-워셜 Floyd-warshall)

2025. 5. 6. 14:24·Algorithm

문제 소개

오늘 풀었던 프로그래머스 - 순위 문제를 정리합니다.

이 문제는 1대1 경기 결과를 통해 선수 간 상대적 순위를 파악할 수 있는지를 묻는 문제입니다.
모든 경기 결과가 주어지는 것이 아니기 때문에, 일부 선수는 순위를 정확히 매길 수 없고, 승패가 명확히 이어지는 선수들만 카운트해야 합니다.

문제 링크: 순위 - 프로그래머스


문제 접근 방식

이 문제는 다음과 같은 방식으로 접근했습니다:

  1. A가 B를 이김 => A → B 방향의 간선으로 모델링
  2. 플로이드-워셜 알고리즘을 사용해, 간접적인 승패 관계까지 모두 파악합니다. (모든 쌍 간 승패 관계 계산)
  3. 어떤 선수 i가 모든 다른 선수 j에 대해 (i가 j를 이기거나 j가 i를 이김)이 성립하면 → 순위 확정 가능

해결 과정 및 코드

핵심 아이디어

  1. chk[i][j] = true → i가 j를 이김
  2. chk[i][k] && chk[k][j] → 간접적으로 i가 j를 이김
  3. 플로이드-워셜 알고리즘으로 승패 관계를 완성 (모든 쌍 간 승패 관계 계산)
  4. 어떤 선수 i에 대해, 자신을 제외한 n-1명과 모두 승/패 관계가 확정돼 있으면 순위도 확정됨

 

코드

시간 복잡도 : O(N^3)

class Solution {
    public int solution(int n, int[][] results) {
        int answer = 0;
        boolean[][] chk = new boolean[n + 1][n + 1]; // 승패 여부를 저장할 배열[][]

        for (int[] r : results) {
            chk[r[0]][r[1]] = true; // r[0]이 r[1]을 이김
        }

		// 플로이드-워셜 알고리즘
        for(int k = 1; k <= n; k++) {
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    if(chk[i][k] && chk[k][j]) {
                        chk[i][j] = true;
                    }
                }
            }
        }

		// i번 선수가 다른 모든 선수와 승/패가 정해져 있으면 카운트
        for(int i = 1; i <= n; i++) {
            boolean definite = true;
            for (int j = 1; j <= n; j++) {
                if (i == j) continue;
                // i가 j를 이기지도 않고, j가 i를 이기지도 않으면
		        // => 순위를 확정할 수 없는 선수
                if (!(chk[i][j] || chk[j][i])) {
                    definite = false;
                    break;
                }
            }
            if (definite) answer++;
        }

        return answer;
    }
}

'Algorithm' 카테고리의 다른 글

스위핑 라인 알고리즘 ( Sweep line algorithm )  (0) 2025.08.24
[프로그래머스] 방의 개수 (그래프)  (0) 2025.05.05
[프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)  (0) 2025.04.29
[프로그래머스] 단어 변환 (BFS)  (0) 2025.04.28
[프로그래머스] 징검다리 (이분탐색)  (0) 2025.04.28
'Algorithm' 카테고리의 다른 글
  • 스위핑 라인 알고리즘 ( Sweep line algorithm )
  • [프로그래머스] 방의 개수 (그래프)
  • [프로그래머스] 네트워크 문제 (유니온 파인드 Disjoint Set)
  • [프로그래머스] 단어 변환 (BFS)
Celion
Celion
오늘도 평소처럼 화이팅!
  • Celion
    Orion Log
    Celion
  • 전체
    오늘
    어제
    • 전체 글 (144)
      • Uncompiled Thoughts (8)
        • 네이버 부스트캠프 10기 (5)
      • CS 기초부터 한 걸음씩 (34)
      • Code Odyssey (22)
      • Algorithm (77)
        • Coding Test Records (63)
      • Git (3)
      • reference (0)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 태그

    Level2
    Kotlin
    boostcamp
    문법정리
    java
    코테
    백준
    시뮬레이션
    프로그래머스
    greedy
    Level3
    알고리즘고득점kit
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
Celion
[프로그래머스] 순위 (플로이드-워셜 Floyd-warshall)
상단으로

티스토리툴바