Menu
Coddy logo textTech

복습 - 우선순위 큐

Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 41번째.

challenge icon

챌린지

중급

모든 우선순위 지정 타입에서 작동하는 우선순위 큐를 만드세요. Prioritized(priority 포함)와 데이터 클래스 Job 및 Ticket이 제공됩니다.

  • TaskQueue<T : Prioritized>에는 push(item), pop(), peek()이 있으며, 가장 높은 우선순위의 항목(우선순위가 같은 경우 먼저 추가된 항목)을 제거하거나 반환하고, 해당 항목이 없으면 null을 반환합니다. 또한 size, items()(pop 순서에 따른 읽기 전용 스냅샷), drain(n)(최대 n개의 항목을 pop하고 List<T>로 반환)도 제공합니다.
  • 제네릭 함수 countUrgent(queue, min)은 어떤 우선순위 지정 타입의 큐든 받아, 해당 우선순위 이상인 항목의 개수를 반환합니다.

제공된 코드는 job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2(tickets) 또는 sizes 명령을 읽고, 각 응답을 출력한 다음 큐에 아직 남아 있는 긴급한 작업과 티켓의 개수와 함께 urgent: 를 출력합니다.

코드는 TaskQueue.kt, Prioritized.kt, Job.kt, Ticket.kt에 작성하세요. Main.kt에는 제공된 입력/출력 코드가 들어 있으며 편집할 수 없습니다.

직접 해보기

fun main() {
    // 제공된 입력/출력 코드: 그대로 유지하세요
    val input = generateSequence(::readLine).toList()
    val jobs = TaskQueue<Job>()
    val tickets = TaskQueue<Ticket>()
    for (cmd in input) {
        val p = cmd.split(" ")
        when (p[0]) {
            "job" -> jobs.push(Job(p[1], p[2].toInt()))
            "ticket" -> tickets.push(Ticket(p[1].toInt(), p[2].toInt(), p[3]))
            "pop" -> println("popped " + (if (p[1] == "jobs") jobs.pop() else tickets.pop()))
            "peek" -> println("next " + (if (p[1] == "jobs") jobs.peek() else tickets.peek()))
            "drain" -> println("drained " + tickets.drain(p[1].toInt()).map { it.customer })
            else -> println("jobs ${jobs.size}, tickets ${tickets.size}")
        }
    }
    println("urgent: ${countUrgent(jobs, 4) + countUrgent(tickets, 4)}")
}

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Kotlin 플레이그라운드