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 |
Tags
- 추상 클래스
- inheritance
- 와일드카드
- java
- 캡슐화
- 인터페이스
- 추상화
- Encapsulation
- 버퍼비우기
- nextInt
- Final
- 객체지향
- 상속
- 백준
- 17472
- enum
- 제네릭
- 열거형
- 최소신장트리
- 다형성
- polymorphism
- 프림알고리즘
- this
- abstract
- 객체 지향
- python
- 생성자
- Scanner
- 내부 클래스
Archives
- Today
- Total
쫑쫑이의 블로그
백준 2623 음악프로그램 Java [위상정렬] 본문
https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
위상 정렬을 사용해서 문제를 풀이했다
입력을 예시로 들면
3 1 4 3 일때
3은 뒤에 숫자니까 넘어가고 1 4 3을 각각 다음 나오는 숫자를 tree의 자식노드처럼 추가해뒀다
1의 자식노드 4, 4의 자식노드 3
자식노드를 추가할 때 자식노드들에 가중치를 1씩 줬다
다음 입력들도 마찬가지로 과정을 반복하고나서
가중치가 0인 노드들부터 큐에 넣고
큐에서 한개씩 빼고 카운트하면서 bfs로 탐색하는데
자식노드의 가중치를 1씩 빼가면서 가중치가 0이 되면 큐에 넣어준다
큐에서 뺄 때 카운트를 하는 과정으로 모든 노드를 탐색했는지 확인 후
모두 돌았으면 방문한 노드들을 순서대로 담은 값을 출력해주면 된다
import java.io.*;
import java.util.*;
public class Main {
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();
Queue<Integer> queue = new LinkedList<>();
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] degree = new int[N + 1];
ArrayList<Integer>[] next = new ArrayList[N+1];
for (int n = 1; n <= N; n++) next[n] = new ArrayList<>();
for (int m = 0; m < M; m++) {
int[] arr = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
for (int i = 2; i < arr.length; i++) {
degree[arr[i]]++;
next[arr[i-1]].add(arr[i]);
}
}
for (int n = 1; n <= N; n++) {
if (degree[n] == 0) {
degree[n]--;
queue.add(n);
}
}
while (!queue.isEmpty()) {
int now = queue.poll();
sb.append(now).append("\n");
N--;
for (int i : next[now]) {
degree[i]--;
if (degree[i] == 0) queue.add(i);
}
}
sb.setLength(sb.length() - 1);
if (N != 0) System.out.println(0);
else System.out.println(sb);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1766 문제집 Java [위상정렬, 우선순위 큐] (0) | 2022.11.08 |
---|---|
백준 1005 ACM Craft Java [위상정렬] (0) | 2022.11.07 |
백준 1647 도시 분할 계획 Java [최소스패닝트리, 프림] (0) | 2022.10.27 |
백준 1197 최소 스패닝 트리 Java [최소스패닝트리, 프림] (0) | 2022.10.27 |
백준 1202 보석 도둑 Java [그리디, 우선순위큐] (1) | 2022.10.24 |