일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바
- 2020 카카오 공채
- 2020 KAKAO BLIND RECRUITMENT
- 부스트코스
- gradle
- Baekjoon
- Java
- 2018 카카오 공채
- CS 스터디
- bfs
- 알고리즘
- 카카오
- 2019 KAKAO BLIND RECRUITMENT
- gcp
- 2018 카카오
- 카카오 공채
- set
- 삼성 SW 기출문제
- 비트마스크
- 삼성 SW 역량테스트
- 2018 KAKAO BLIND RECRUITMENT
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- map
- 백준
- 프로그래머스
- dfs
- 2019 카카오 공채
- c++
- 2018 KAKAO BLIND RECRUITMENT 1차
- 젠킨스
Archives
- Today
- Total
아무코딩
[백준 2623] 음악프로그램 (java) 본문
문제풀이
위상정렬을 활용한다. 이 문제에서는 위상정렬이 성립되지 않는 경우를 생각해야된다.
위상정렬이 이루어지는 조건은 노드가 다 출력될때까지 in-degree가 0이 아닌 노드가 없는 것인데 그거 말고 이상한 방법으로 사이클 체크를 하려해서 고생을 했다.
개념에 충실하자...
추가로 위상정렬을 간략하게 설명하자면
indegree가 0인 노드를 큐에다 추가하는 방식
프린트는 물론 큐에서 하나씩.
그러면 순서가 보장된다.
소스코드
더보기
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Baekjoon2623 {
static int N;
static int M;
static ArrayList<Integer>[] graph;
static int[] countOfInDegree;
static Queue<Integer> queue;
static ArrayList<Integer> result = new ArrayList<>();
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
M = scan.nextInt();
graph = new ArrayList[N+1];
countOfInDegree = new int[N+1]; //초기값 0이라서 int배열
queue = new LinkedList<>();
initGraph(scan);
for(int i=1;i<=N;i++){
if(countOfInDegree[i]==0)
queue.add(i);
}
if(queue.isEmpty()){
System.out.println(0);
return;
}
arrangeOrder();
if(result.size()!=N)
System.out.println(0);
else {
for (int num : result) {
System.out.println(num);
}
}
}
public static void arrangeOrder() {
while(!queue.isEmpty()){
int node = queue.poll();
result.add(node);
for(int i=0;i<graph[node].size();i++){
countOfInDegree[graph[node].get(i)]--;
if(countOfInDegree[graph[node].get(i)]==0){
queue.add(graph[node].get(i));
}
}
graph[node].clear();
}
}
public static void initGraph(Scanner scan) {
for(int i=1;i<=N;i++){
graph[i] = new ArrayList<>();
}
for(int i=0;i<M;i++){
int num = scan.nextInt();
int from = scan.nextInt();
int to =0;
for(int j=1;j<num;j++){
to = scan.nextInt();
graph[from].add(to);
countOfInDegree[to]++;
from = to;
}
}
}
}
|
cs |
문제 링크 : https://www.acmicpc.net/problem/2623
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2931] 가스관(java) (0) | 2020.05.20 |
---|---|
[백준 17070] 파이프 옮기기1 (java) (0) | 2020.05.19 |
[백준 2352] 반도체 설계 (0) | 2020.05.15 |
[백준 17281] 야구 (0) | 2020.05.12 |
[백준 2580] 스도쿠 (0) | 2020.05.11 |
Comments