Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코딩테스트실력진단
- 완탐
- 알고리즘기본개념
- DFS
- SWEA
- 트러블슈팅
- JUnit
- 코딩테스트
- 다시보기
- Union Find
- SSAFY
- 코테
- Java
- BFS
- DP
- 그래프
- 그리디
- 다익스트라
- JPA
- 유니온파인드
- 자바
- 완전탐색
- 부분수열의합2
- 싸피
- 백준
- 기본유형
- 코드트리
- database
- 알고리즘
- Spring
Archives
- Today
- Total
HwangHub
[Java/Topological Sort] 백준 2252. 줄세우기 본문
🤔 Intuition
* 그래프를 활용할 것이라는 건 명확했지만, 위상정렬을 잘 몰라서 유니온 파인드로 접근하다가 데였다.
* 정렬을 어떻게 하지? 하는 생각을 바탕으로 유니온 파인드만 써서 지저분하게 풀다가 "이거 안되는건가?" 하고 알아봤는데 위상정렬이었다.
* 위상정렬이라는 유형이 존재하며, inDegree를 이용한 알고리즘을 한번 학습한 적은 있었지만 체화가 안되어있었다.
* 최빈출 유형은 아니지만, 그래도 기왕 보게 된 김에 알아두자.
* 알고보니 위상정렬 대표유형 문제... 어쩐지 정답률이 높더라
🔎 Algorithm & Complexity
* @algorithm topological sort
* @time O(N + M) ; indegree활용 위상정렬 - 노드개수 N, 간선개수 M -> 524 ms
* @memory O(N + M) ; 노드 개수만큼 inDegree 배열 운영 + 간선 리스트 운영 -> 51944 KB
👨🏻💻 Logic
그냥 위상정렬 알고리즘 적용하면 된다.
public class Main {
private static int N, M;
private static ArrayList<Integer>[] adj;
private static int[] inDegree;
private static ArrayDeque<Integer> q = new ArrayDeque<>();
private static ArrayDeque<Integer> ans = new ArrayDeque<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
inDegree = new int[N+1];
adj = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
adj[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
adj[b].add(a);
inDegree[a]++;
}
for (int i = 1; i <= N; i++) {
if (inDegree[i] == 0) {
q.add(i);
}
}
while (!q.isEmpty()) {
int v = q.poll();
ans.addLast(v);
for (int u : adj[v]) {
inDegree[u]--;
if (inDegree[u] == 0) {
q.add(u);
}
}
}
while (!ans.isEmpty()) {
sb.append(ans.pollLast()+" ");
}
System.out.println(sb.toString());
}
}
'workspace > 알고리즘' 카테고리의 다른 글
[Java/투포인터] 백준 2482. 색상환 (1) | 2024.03.27 |
---|---|
[Java/투포인터] 코드트리. 겹치는 숫자가 없는 최대 구간 (0) | 2024.03.27 |
[Java/다익스트라] 백준 13549. 숨바꼭질3 (0) | 2024.03.21 |
[Java/Map] 코드트리. 두 수의 합 (0) | 2024.03.20 |
[Java/BFS] 소프티어. 안전운전을 도와줄 차세대 지능형 교통시스템 (2) | 2024.03.19 |
Comments