ALGORITHM/PROGRAMMERS

[프로그래머스] 순위

0298 2021. 8. 30. 23:25

https://programmers.co.kr/learn/courses/30/lessons/49191

 

코딩테스트 연습 - 순위

5 [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] 2

programmers.co.kr

2021-08-30


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
    public int solution(int n, int[][] results) {
         int answer = n;
        int[][] dist = new int[n][n];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(i == j) continue;
                dist[i][j] = 987654321;
            }
        }
 
        for(int i = 0; i < results.length; i++) {
            dist[results[i][0]-1][results[i][1]-1= 1;
        }
 
       for(int m = 0; m < n; m++) {
           for(int s = 0; s < n; s++) {
               for(int e = 0; e < n; e++) {
                   if(dist[s][e] > dist[s][m] + dist[m][e]) {
                       dist[s][e] = dist[s][m] + dist[m][e];
                   }
               }
           }
       }
 
       for(int i = 0; i < n; i++) {
           for(int j = 0; j < n; j++) {
               if(dist[i][j] == 987654321 && dist[j][i] == 987654321) {
                   answer--;
                   break;
               }
           }
       }
 
        return answer;
    }
}
cs

#문제풀이

이 문제는 도저히 감이 안 잡혀서, 결국 다른 사람 풀이 검색해서 참고했다...

 

결론을 말하면 플로이드 와샬을 이용해서 풀면 되는 문제인데, 정말 생각하지도 못했던 부분이었다.

 

예를 들어, 우리가 [1, 2]의 경기 결과를 알고, [2, 3]의 경기 결과를 알고 있다면 그 의미는 [1, 3]의 경기 결과도 알 수 있다는 의미이다. 그리고 플로이드 와샬은 모든 정점에서 (+거쳐가는) 모든 정점으로까지의 최단 경로를 구할 수 있는 알고리즘이다. 

그래서 이 알고리즘을 사용하면 최단 경로와 거쳐가는 경로들을 모두 알 수 있다. 즉, [1, 2]와 [2, 3]이 주어졌을 때 [1, 3]도 알 수 있는 것이다.

 

일반적으로 플로이드 와샬 사용하는 방식 그대로 dist 배열 초기화 하고, 모든 정점과 거쳐가는 정점까지 체크해서 dist 배열을 업데이트 시켜줬다.

 

그리고, 맨 마지막에 만약 dist 경로 [i][j]와 [j][i]의 경로가 모두 INF라면(갱신이 되지 않았다면), 그 경로는 아에 없다라는 뜻이다. 즉, 이 문제로 따지면 승패를 알 수가 없다.

 

나를 제외한 남은 정점들을 방문할 수 있어야지 승패를 알 수 있다.

 


비슷한 문제라고 어떤 블로그에서 봤는데, 나중에 풀어봐야겠다.

https://www.acmicpc.net/problem/10159

 

10159번: 저울

첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩

www.acmicpc.net