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
- 구현
- SCC
- 페르마 소정리
- kruskal
- kapt
- 알고리즘
- 그래프
- DP
- Meet in the middle
- miller-rabin
- MST
- MySQL
- BindingAdapter
- DFS
- tarjan
- union-find
- BFS
- 분리 집합
- Linux
- 누적 합
- spring boot
- springdoc
- 위상정렬
- concurreny
- disjoint set
- 이분 탐색
- 백트래킹
- 투 포인터
- Java
- 위상 정렬
Archives
- Today
- Total
기맹기 개발 블로그
[BOJ 2623] 음악프로그램 (Java) 본문
BOJ 2623 음악프로그램
난이도 : 골드 3
https://www.acmicpc.net/problem/2623
2623번: 음악프로그램
첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한
www.acmicpc.net
전략
위상정렬을 사용하여 풀 수 있는 문제임을 알 수 있다.
2252 줄세우기 문제와 비슷하지만 다른 점이 있다.
예제의 입력을 보면

이렇게 각 PD별로 가수의 순서를 정할 수 있는데, 1:1이 아니라 여러명의 가수의 순서를 정하는 것이다.
이로 인해 하나의 노드에서 여러 개의 링크를 가질 수 있다.

따라서 링크를 배열로 저장하여 해결하였다.
시행착오
오랜만에 백준을 푸니까 입력을 받을 때 실수가 있었다.
입력의 가수 순서 inputs[j]를 그냥 j로 사용하여서 의도와 다른 결과가 나왔다.
기초적인 실수지만 NullPointer, ArrayBound 등의 예외가 발생하지 않으므로 발견하기 어려워 앞으로 주의해야 할 것 같다.
코드
package BOJ_2623;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] inputs;
int N, M;
inputs = br.readLine().split(" ");
N = Integer.parseInt(inputs[0]);
M = Integer.parseInt(inputs[1]);
Node[] nodes = new Node[N + 1];
// init
for (int i = 0; i <= N; i++) {
nodes[i] = new Node(i);
}
// read inputs
for (int i = 0; i < M; i++) {
inputs = br.readLine().split(" ");
for (int j = 1; j < inputs.length - 1; j++) {
int cur = Integer.parseInt(inputs[j]);
int next = Integer.parseInt(inputs[j + 1]);
nodes[cur].linking.add(nodes[next]);
nodes[next].inDegree++;
}
}
List<Node> sorted = topologySort(nodes);
if (sorted == null)
System.out.println(0);
else
sorted.forEach(n -> {
System.out.println(n.num);
});
}
private static List<Node> topologySort(Node[] nodes) {
Queue<Node> queue = new LinkedList<>();
List<Node> result = new ArrayList<>();
for (int i = 1; i < nodes.length; i++) {
if (nodes[i].inDegree == 0) {
queue.offer(nodes[i]);
}
}
// for n times (exclude index 0)
for (int i = 1; i < nodes.length; i++) {
if (queue.isEmpty()) {
return null;
}
Node cur = queue.poll();
for (Node link : cur.linking) {
link.inDegree--;
if (link.inDegree == 0) {
queue.offer(link);
}
}
result.add(cur);
}
return result;
}
static class Node {
final int num;
int inDegree = 0;
List<Node> linking = new ArrayList<>();
public Node(int num) {
this.num = num;
}
}
}
깨달은 점
간만에 백준을 풀려고 하니까 손도 머리도 다 잘 안따라준다..
그래도 차근차근 요구사항을 읽고 그림을 그린 덕분에 헤매지 않고 바로 구현할 수 있었다.
여유를 가지는게 더 빨리 가는 길일 수도 있겠다고 생각했다..
'PS' 카테고리의 다른 글
| [BOJ 2473] 세 용액 (Java) (1) | 2022.12.27 |
|---|---|
| [BOJ 12100] 2048 (Easy) (Java) (0) | 2022.12.26 |
| [BOJ 14238] 출근 기록 (Java) (0) | 2022.09.12 |
| [BOJ 12969] ABC (Java) (0) | 2022.09.11 |
| [BOJ 11066] 파일 합치기 (Java) (1) | 2022.09.11 |