[프로그래머스] 디스크 컨트롤러 in Kotlin

ddanglehee·2022년 8월 8일
0

코딩테스트 준비

목록 보기
5/18
post-thumbnail

📜 문제

문제 링크

💡 나의 풀이

   작업의 요청부터 종료까지 걸린 시간의 합을 최소로 하려면, 작업의 소요시간은 변하지 않는 값이기 때문에 작업들의 대기시간을 줄여야한다.
  작업들의 대기시간을 줄이려면, 현재 시점에서 대기중인 작업들 중에 가장 소요시간이 짧은 작업을 선택해야한다. 왜냐하면, 예를 들어 대기큐에 5가지 작업이 대기중이고 그 중 A라는 작업이 가장 소요시간이 길다고 가정할 때, A부터 작업을 수행하게 된다면, 그 이후에 오는 작업들의 대기시간에는 A의 소요시간이 항상 포함되게 되어 전체 대기시간이 늘어나게 되기 때문이다.
  따라서 소요시간이 짧은 것이 root에 오도록 PriorityQueue에 담아서 구현하였다.

⌨️ 코드

import java.util.*

class Solution {
     fun solution(jobs: Array<IntArray>): Int {
         var answer = 0
         jobs.sortBy { it[0] }

         val priorityQueue = PriorityQueue<IntArray>(compareBy { it[1] })
         priorityQueue.add(jobs[0])
         var t = jobs[0][0] // 시간
         var i = 1 // jobs Index

        while (i < jobs.size || priorityQueue.isNotEmpty()) {
            // t시간, 그 이전에 들어온 요청을 큐에 넣기
            while (i < jobs.size && jobs[i][0] <= t) {
                priorityQueue.add(jobs[i++])
            }

            if (priorityQueue.isNotEmpty()) {
                val currentJob = priorityQueue.poll()
                answer += (t - currentJob[0] + currentJob[1]) // 현재 작업 반환 시간 answer에 더하기
                t += currentJob[1]
            } else {
                t++
            }
        }

        return answer / jobs.size
    }
}

😄 느낀 점

처음 문제를 봤을 때는 PriorityQueue에 넣을 때 (현재시간 - 요청 시점 + 작업의 소요시간)이 작은 것을 기준으로 잡았다. 대기시간을 줄이는 방법이 지금까지 대기한 시간과 작업의 소요시간을 더한 게 짧은 작업이 먼저 수행되야 응답시간을 줄일 수 있다고 생각했었기 때문이다. 하지만 이는 그 후에 오는 작업들의 대기시간이 더 늘어나는 걸 고려하지 않았고 또, 작업의 소요시간은 항상 일정하다는 것을 놓쳤기 때문에 잘못 생각했던 거 같다!,,
아직 이런 기준을 처음부터 세우는 게 나한테는 어렵다🥲 기준을 세우면 혹시나 놓치고 간 엣지 케이스들은 없는지 생각하는 능력이랑 기준을 세운 명확한 이유를 찾아내는 능력이 아직 좀 부족한 거 같다.

profile
잊고싶지 않은 것들을 기록해요✏️

0개의 댓글