이것 참 뭔가 노드의 관계가 주어진 것 같다.
이는 Directed Graph로 풀 수 있을 것 같다
풀이법 생각
"정확하게 순위를 매길 수 있는 " 선수의 수..
정확하게 순위를 매길 수 있다는 것은. 모든 노드들과의 확실한 관계가 있는 것을 의미하는가?????
일단 효율성을 생각하지 않겠다.
- 주어진 results를 이용해서 그래프를 생성한다. ( Adjacent list로 만든다)
- adjacent matrix를 생성한다 : -1로 초기화
- v1 —> v2 까지 경로가 있는 경우 : v1이 v2에게 이기는 것 —> 1을 저장
- v2 —> v1은 지는 것이기 때문에 0을 저장한다.
- 모든 경우를 완료 한 후, matrix[v1] row에 대해 -1 이 하나도 존재하지 않는 경우 —> 순위가 확정된 것 을 의미한다.
- 이 graph를 이용하여 adjacent matrix 정보를 채워나간다.
- 각 노드에 대해 완전탐색 한다.
- BFS를 통하여, v1 —> v2 까지의 경로가 있는지 하나하나 탐색한다.
- 완전탐색 을 완료 한 후, 초기값이 남아있지 않는 선수의 수를 카운트한다.
import java.util.*;
class Solution {
public int solution(int n, int[][] results) {
int answer = 0;
int[][] matrix = new int[n][n];
for(int i=0;i<matrix.length;i++){
Arrays.fill(matrix[i],-1);
}
ArrayList<LinkedList<Integer>> graph = new ArrayList<>(n);
// results 를 이용하여 graph 를 생성한다.
for(int i=0;i<n;i++)
graph.add(new LinkedList<>());
// results의 row별로 값을 얻어온다.
for(int r=0;r<results.length;r++){
int win = results[r][0]-1;
int lo = results[r][1]-1;
graph.get(win).add(lo);
}
// 완전 탐색. 각 노드에 대해
for(int v=0;v<n;v++){
bfs(v,graph,matrix);
}
for(int v=0;v<n;v++){
boolean fill =true;
for(int col=0;col<n;col++){
if(matrix[v][col]<0) {
fill = false;
break;
}
}
if(fill) answer++;
}
return answer;
}
//
public void bfs(int start,ArrayList<LinkedList<Integer>> graph,int[][] matrix){
int[] visit = new int[graph.size()];
Queue<Integer> q = new LinkedList<>();
visit[start]=1;
q.add(start);
matrix[start][start] = 0;
while(q.isEmpty()==false){
int cur = q.poll();
Iterator<Integer> it = graph.get(cur).iterator();
while(it.hasNext()){
int next = it.next();
if(visit[next]==1)continue;
//System.out.println(start+1+"--> "+(next+1));
visit[next]=1;
matrix[start][next]=1;
matrix[next][start]=0;
q.add(next);
}
}
}
}
import java.util.*;
class Solution {
public int solution(int n, int[][] results) {
int answer = 0;
int[][] matrix = new int[n][n];
for(int i=0;i<matrix.length;i++){
Arrays.fill(matrix[i],-1);
}
for(int r=0;r<results.length;r++){
int win = results[r][0]-1;
int lo = results[r][1]-1;
matrix[win][lo] =1;
}
for(int start=0;start<n;start++)
bfs(start,matrix);
for(int r=0;r<n;r++){
boolean flag = true;
for(int col=0;col<n;col++){
if(matrix[r][col]<0){
flag = false;
break;
}
}
if(flag) answer++;
}
return answer;
}
//
public void bfs(int start,int[][] graph){
int[] visit = new int[graph.length];
Queue<Integer> q = new LinkedList<>();
visit[start]=1;
q.add(start);
graph[start][start] = 0;
while(q.isEmpty()==false){
int cur = q.poll();
for(int col=0;col<graph.length;col++){
if(visit[col]>0) continue;
if(graph[cur][col]<=0) continue;
//System.out.println(start+1+"--> "+(col+1));
visit[col]=1;
graph[start][col]=1;
graph[col][start]=0;
q.add(col);
}
}
}
}