5643번(키 순서)
17706 단어 SW Expert AcademySW Expert Academy
문제 출처: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXQsLWKd5cDFAUo
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Solution {
private static List<Integer>[] adjList;
private static int[][] students;
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine()); // 테스트케이스 개수
for (int t = 0; t < T; t++) {
int N = Integer.parseInt(reader.readLine()); // 학생들의 수
students = new int[N + 1][2]; // 0 -> 들어오는 수, 1 -> 나가는 수
int M = Integer.parseInt(reader.readLine()); // 비교 횟수
adjList = new List[N + 1]; // 1-base index, 인접리스트
for (int i = 0; i <= N; i++) {
adjList[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
int from = Integer.parseInt(tokenizer.nextToken());
int to = Integer.parseInt(tokenizer.nextToken());
adjList[from].add(to);
}
for (int i = 1; i <= N; i++) {
dfs(i, new boolean[N + 1], i);
}
int cnt = 0;
for (int i = 1; i <= N; i++) {
if (students[i][0] + students[i][1] == N - 1) cnt++;
}
sb.append("#").append(t + 1).append(" ");
sb.append(cnt).append("\n");
}
System.out.println(sb);
}
private static void dfs(int node, boolean[] visited, int origin) {
visited[node] = true;
for (int n : adjList[node]) {
if (!visited[n]) {
students[origin][1]++;
students[n][0]++;
dfs(n, visited, origin);
}
}
}
}
- 이전에 풀었던 프로그래머스의 "순위" 문제와 똑같은 문제여서 빠르게 풀 수 있었다.
- 핵심은 나에게 들어오는 수와 나가는 수의 합이 N-1이 되는 사람은 정확한 순위를 알 수 있는 것이다.
Author And Source
이 문제에 관하여(5643번(키 순서)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ghc1124/SW-Expert-Academy-5643번키-순서저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)