👀 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=kotlin
👊 도전
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. 설명
- currentTime내 가능한 작업을 PriorityQueue에 넣는다
- 우선순위 큐의 정렬 조건은 소요시간이 낮은 순, (소요시간이 같다면) 요청시간이 빠른 순이다.
- currentTime이 갱신되면 jobs 내부에서 currentTime 조건을 만족하는 작업들을 큐에 다시 넣는다.
- 그리고 다시 큐를 체크한다.