링크
swea5643. 키순서
풀이
- 자신의 키가 몇번째인지 알 수 있을려면 자신보다 키가 크거나 작은 학생의 수가 N-1명이어야한다.
- 인접행렬로 입력 받아서 DFS탐색을 한다. => 두가지 버전의 인접행렬
- 자신보다 키가 큰 경우를 탐색하면서 카운트 + 자신보다 키가 작은 경우를 탐색하면서 카운트 = N - 1
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Solution_5643_키순서 {
private static int N, ANS, CNT;
private static int M, compare[][],reverseCompare[][] ;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc = 1; tc <= T; tc++) {
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
ANS=0;
compare= new int[N+1][N+1];
reverseCompare= new int[N+1][N+1];
for(int i = 0 ;i < M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
compare[a][b] = 1;
reverseCompare[b][a] = 1;
}
for(int i = 1; i <= N; i++) {
CNT = 0;
dfs(i ,compare, new boolean[N+1]);
dfs(i ,reverseCompare, new boolean[N+1]);
if(CNT == N-1) ANS++;
}
System.out.println("#" + tc +" " + ANS);
}
}
private static void dfs(int s, int[][] adjMatrix, boolean[] vis) {
vis[s] = true;
for(int i = 1; i <=N; i++) {
if(adjMatrix[s][i] == 1 && !vis[i]) {
CNT++;
dfs(i, adjMatrix, vis);
}
}
}
}