PS(Problem Solving)/BOJ

[백준/BOJ] 2623번: 음악프로그램

JunsuKim 2022. 9. 10.
728x90

문제

https://www.acmicpc.net/problem/2623

 

2623번: 음악프로그램

첫째 줄에는 가수의 수 N과 보조 PD의 수 M이 주어진다. 가수는 번호 1, 2,…,N 으로 표시한다. 둘째 줄부터 각 보조 PD가 정한 순서들이 한 줄에 하나씩 나온다. 각 줄의 맨 앞에는 보조 PD가 담당한

www.acmicpc.net

해설

보조 PD 3명이 담당한 가수들의 순서를 정한다.

이때 한 가수를 여러 보조 PD가 담당할 수 있다.

 

이렇듯 이미 순서가 정해져 있고, 선행 순서를 위배하지 않으면서 순서를 정하는 것은 위상 정렬(topological sort) 알고리즘을 사용하면 된다.

위상 정렬은 여러 가지 답이 나올 수 있으므로, 코드를 어떻게 짜냐에 따라 답이 달라질 수 있다.

코드

import java.util.*
import kotlin.collections.ArrayList

private lateinit var graph: ArrayList<ArrayList<Int>>
private lateinit var degree: IntArray

fun main() = with(System.`in`.bufferedReader()) {
    val (singerCnt, pdCnt) = readLine().split(" ").map { it.toInt() }

    graph = ArrayList(ArrayList())
    repeat(singerCnt + 1) {
        graph.add(ArrayList())
    }

    degree = IntArray(singerCnt + 1)

    repeat(pdCnt) {
        val st = StringTokenizer(readLine())
        val cnt = st.nextToken().toInt()
        var priority = st.nextToken().toInt()

        repeat(cnt - 1) {
            val next = st.nextToken().toInt()
            graph[priority].add(next)
            degree[next]++

            priority = next
        }
    }

    topologicalSort(singerCnt)
}

private fun topologicalSort(n: Int) {
    val result = ArrayList<Int>()
    val que: Queue<Int> = LinkedList()

    for(i in 1 .. n) {
        if(degree[i] == 0) que.add(i)
    }

    while(que.isNotEmpty()) {
        val cur = que.poll()
        result.add(cur)

        for(next in graph[cur]) {
            degree[next]--

            if(degree[next] == 0) que.add(next)
        }
    }

    if(result.size != n) println(0)

    for(i in result) println(i)
}
728x90

'PS(Problem Solving) > BOJ' 카테고리의 다른 글

[백준/BOJ] 1766번: 문제집  (0) 2022.09.13
[백준/BOJ] 9252번: LCS 2  (0) 2022.09.12
[백준/BOJ] 2467번: 용액  (2) 2022.09.09
[백준/BOJ] 13904번: 과제  (0) 2022.09.09
[백준/BOJ] 5972번: 택배 배송  (0) 2022.09.07

댓글