[Kotlin/프로그래머스] 코딩테스트 연습 > 힙(Heap) > 디스크 컨트롤러

👀 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=kotlin

👊 도전

1. 설계

  1. 문제 조건에 맞게 진행

2. 구현

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import kotlin.math.*

class Solution {
    fun solution(jobs: Array<IntArray>): Int {

/*
1. jobs를 요청시간순으로 정렬, ct=jobs[0]
2. Jobs 순회하면서 ct내 가능한 아이들을 q에 담음
3. ct보다 큰값이 나오면 멈추고 q가 빌때까지 조건 체크,
4. q에서 poll순서는 소요시간이 짧고, 소요시간이 같다면 요청시간이 빠른 순
5. total=ct-요청시간+소요시간, ct += q.소요시간
6. ct가 변경되면 jobs내 ct만족하는 애들을 모두 job에 넣음
7. 그리고 다시 q 체크
8. q가 비면 job 순회 재시작
9. jobs 순회밖에서 q가 notEmpty면 똑같이수행
10. total/jobs.size를 리턴
    */
       jobs.sortBy { it[0] }
       println(jobs.contentDeepToString())
       var currentTime = jobs.first()[0]
       var total = 0
       val pq = PriorityQueue<IntArray>(compareBy({ it[1] }, { it[0] }))
       var i = 0
       while (i < jobs.size) {
           if (jobs[i][0] <= currentTime) {
               pq.offer(jobs[i])
               i++
           } else {
               if (pq.isEmpty()) {
                    currentTime = jobs[i][0]
                }
               while (pq.isNotEmpty()) {
                   val item = pq.poll()
                   total += currentTime - item[0] + item[1]
                   currentTime += item[1]
                   break
               }
           }
       }
       while (pq.isNotEmpty()) {
           val item = pq.poll()
           total += currentTime - item[0] + item[1]
           currentTime += item[1]
       }
       return total / jobs.size
   }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. currentTime내 가능한 작업을 PriorityQueue에 넣는다
    • 우선순위 큐의 정렬 조건은 소요시간이 낮은 순, (소요시간이 같다면) 요청시간이 빠른 순이다.
    • currentTime이 갱신되면 jobs 내부에서 currentTime 조건을 만족하는 작업들을 큐에 다시 넣는다.
    • 그리고 다시 큐를 체크한다.

👏 해결 완료!