[프로그래머스] 순위
2025. 4. 30. 16:10ㆍ코테공부/문제풀이
문제
일부만 확인 가능한 경기 결과를 보고 순위를 매길 수 있는 선수의 수를 반환하면 된다.

풀이방법
풀이 시간 : 20분
풀이 방법 : 플로이드-워셜
플로이드-워셜 알고리즘을 사용해 문제를 풀이하면 된다.
[알고리즘] 플로이드-워셜 알고리즘
플로이드-워셜(Floyd-warshall) 알고리즘 쉽게 이해하기그래프 문제 중, 모든 정점 쌍의 최단 경로를 구하는 문제를 만나면 어떻게 해야할까?바로 이럴 때 사용되는 알고리즘이 플로이드-워셜 알고
90000e.tistory.com
플로이드-워셜 알고리즘을 이용해 이기는 사람과 지는 사람의 모든 경우를 확인한다.
만약 1이 3한테 지고 4가 1한테 진다면, 4도 3에게 지는게 된다.
이런식으로 모든 경우를 확인한 후 자신을 제외한 모든 선수에게 이기고 지는지를 판단할 수 있으면 된다.
그래서 이길때는 1로 질때는 -1로 배열을 초기화 해주고 1번 선수부터 1과 -1의 갯수를 확인해 자신을 제외한 모든 인원수의 갯수와 똑같이 이기고 진 수를 확인할 수 있을때 순위가 결정될 수 있다고 판단했다.
코드
import java.util.*;
import java.io.*;
class Solution {
static int[][] map;
public int solution(int n, int[][] results) {
int answer = 0;
map = new int[n+1][n+1];
for(int i = 1; i <= results.length; i++){
int a = results[i-1][0];
int b = results[i-1][1];
map[a][b] = 1;
map[b][a] = -1;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
for(int k = 1; k <= n; k++){
if(map[i][k] == 1 && map[k][j] == 1){
map[i][j] = 1;
map[j][i] = -1;
}
if(map[i][k] == -1 && map[k][j] == -1){
map[i][j] = -1;
map[j][i] = 1;
}
}
}
}
for(int i = 1; i <= n; i++){
int cnt = 0;
for(int j = 1; j <= n; j++){
if(map[i][j] != 0){
cnt++;
}
}
if(cnt == n - 1){
answer++;
}
}
return answer;
}
}'코테공부 > 문제풀이' 카테고리의 다른 글
| [프로그래머스] 미로 탈출 (0) | 2025.05.26 |
|---|---|
| [프로그래머스] 소수찾기 (1) | 2025.05.07 |
| [프로그래머스] 방의 개수 (0) | 2025.04.29 |
| [백준] 14503 로봇 청소기 (0) | 2025.04.21 |
| [코드트리] 보도블럭 (0) | 2025.04.02 |