반응형
12-23 19:41
- Today
- Total
Link
개발하는 고라니
[Programmers] 순위 본문
반응형
[Floyd-Warshall]
플로이드 와샬 알고리즘을 수행해서, i번 사람이 j번 사람에게 직접/간접적으로 도달할 수 있는지 체크한 다음, i번 사람이 자기 자신을 제외한 모든 사람에게 도달할 수 있으면 순위를 확실히 알 수 있다.
문제에서 주어진 조건은 간선이 단방향이라는 것을 알려준다. 따라서 주어진 입력을 적절히 이용하여 직접적인 A와 B의 관계를 boolean[ ][ ]에 표현하고 플로이드 와샬을 수행하면, A가 C에게 도달 할 수 있는지 여부를 알 수 있다.
표를 보며 이해하면 더 쉽게 와닿을 수 있을 것이다.
주어진 입력으로 boolean[][] 배열을 지정하면 다음과 같다.
[[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]
F | T | F | F | F |
F | F | F | F | T |
F | T | F | F | F |
F | T | T | F | F |
F | F | F | F | F |
(1, 2) = T로 표기되어 있는데, 이는 1과 2의 관계는 정해졌다는 뜻이다.
이제 플로이드 와샬을 사용하면 다음과 같다.
F | T | F | F | T |
F | F | F | F | T |
F | T | F | F | T |
F | T | T | F | T |
F | F | F | F | F |
5번 행을 예로 설명하자면, (5, 1)은 F이지만, (1, 5)는 T이다. 따라서 1과 5는 관계가 정해졌다는 것이고,
(5, 2)는 F이지만 (2, 5)는 T이다. 이렇게 (i, j) 또는 (j, i) 둘 중 하나만 T여도 둘의 관계가 정해진 것이므로, 이 개수가 n-1개면 순위를 확실히 알 수 있는 사람의 개수를 증가시킨다.
# Code </>
class Solution {
static boolean[][] dist = new boolean[101][101];
public int solution(int n, int[][] results) {
for(int[] arr:results)
dist[arr[0]][arr[1]] = true;
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(dist[i][k] && dist[k][j])
dist[i][j] = true;
int answer = 0;
for(int i=1; i<=n; i++) {
int cnt = 0;
for (int j = 1; j <= n; j++)
if (dist[i][j] || dist[j][i])
cnt++;
if(cnt == n-1)
answer++;
}
return answer;
}
}
반응형
'Programming > 프로그래머스' 카테고리의 다른 글
[Programmers] 문자열 압축 (0) | 2021.05.11 |
---|---|
[Programmers] 124 나라의 숫자 (0) | 2021.05.10 |
[Programmers] 가장 먼 노드 (0) | 2021.03.28 |
[Programmers] 문자열 내 마음대로 정렬하기 (0) | 2021.03.17 |
[Programmers] 지형 이동 (0) | 2021.03.10 |
Comments