본문 바로가기
코딩테스트 준비(kotlin)/자료구조

[프로그래머스,kotlin] 디스크 컨트롤러 (우선순위 큐로 구현)

by 1chanhue1 2025. 1. 12.

import java.util.PriorityQueue

class Solution {
    fun solution(jobs: Array<IntArray>): Int {
        // Job 데이터 클래스 정의
        data class Job(val requestTime: Int, val duration: Int, val id: Int)

        // 요청 시간 순으로 정렬된 큐
        val requestQueue = PriorityQueue<Job>(compareBy({ it.requestTime }, { it.id }))

        // 작업 시간이 짧은 순서로 정렬된 작업 대기 큐
        val taskQueue = PriorityQueue<Job>(compareBy({ it.duration }, { it.requestTime }, { it.id }))

        // 요청 배열을 Job 객체로 변환 후 요청 시간 기준으로 큐에 추가
        jobs.forEachIndexed { index, job ->
            requestQueue.add(Job(job[0], job[1], index))
        }

        var currentTime = 0 // 현재 시각
        var totalTurnaroundTime = 0 // 총 반환 시간

        while (requestQueue.isNotEmpty() || taskQueue.isNotEmpty()) {
            // 현재 시간까지 도달한 작업들을 대기 큐로 이동
            while (requestQueue.isNotEmpty() && requestQueue.peek().requestTime <= currentTime) {
                taskQueue.add(requestQueue.poll())
            }

            if (taskQueue.isNotEmpty()) {
                // 작업 시간이 짧은 작업 처리
                val task = taskQueue.poll()
                currentTime += task.duration
                totalTurnaroundTime += currentTime - task.requestTime
            } else {
                // 처리할 작업이 없으면 시간 경과
                currentTime = requestQueue.peek().requestTime
            }
        }

        // 평균 반환 시간 계산 후 정수 부분 반환
        return totalTurnaroundTime / jobs.size
    }
}
 

코드 설명

  1. Job 클래스 정의:
    • 작업의 요청 시간, 소요 시간, 작업 ID(작업의 번호임)를 저장하기 위한 데이터 클래스.
  2. requestQueue와 taskQueue:
    • requestQueue: 작업 요청 시간 기준으로 정렬된 우선순위 큐.
    • taskQueue: 작업 시간이 짧은 순으로 정렬된 우선순위 큐.
  3. 작업 큐 초기화:
    • jobs 배열을 Job 객체로 변환하여 requestQueue에 삽입.
  4. 작업 처리:
    • 현재 시간까지 요청된 작업을 taskQueue로 옮김.
    • taskQueue에서 가장 우선순위가 높은 작업(작업 시간이 짧은 작업)을 처리.
    • 작업이 없는 경우 다음 작업 요청 시간으로 현재 시간을 이동.
  5. 반환 시간 계산:
    • 각 작업의 종료 시간에서 요청 시간을 뺀 값을 누적.
    • 총 반환 시간을 작업 수로 나누어 평균 반환 시간을 구함.