우선순위큐 문제이다 대기큐에 들어와있는 프로세스중 실행시간이 짧은 프로세스부터 처리한다
https://school.programmers.co.kr/learn/courses/30/lessons/42627
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
import java.util.PriorityQueue
class Solution {
fun solution(jobs: Array<IntArray>): Int {
var answer = 0
// 짧은 작업을 우선으로 반환하는 대기큐
val jobQueue =
PriorityQueue<IntArray>(compareBy<IntArray?>() { it?.get(1) }.thenBy { it?.get(0) })
// 대기중인 작업들을 담을 해시맵
val jobsList = jobs.toMutableList()
jobsList.sortBy { it[0] }
// 현재 작업중인 프로세스
var processingJob: IntArray? = null
// 현재 작업중인 프로세스가 끝날시간
var currentProcessEndTime: Int? = null
// 각 작업들의 요청시간과 반환시간을 저장할 list<IntArray<Int>>
var result = mutableListOf<List<Int>>()
// 들어온 프로세스들의 총 실행시간
var processingTime = 0
jobs.forEach {
processingTime += it[1]
}
var i = 0
while (result.size != jobs.size){
//i초에 큐에들어가서 대기리스트에서 삭제될 작업들의 인덱스리스트
val deleteList = mutableListOf<IntArray>()
// i초에 큐에들어갈 작업을 넣어준다
if (jobsList.size != 0) {
for (item in jobsList) {
if (item[0] == i) {
//작업을 넣는다
jobQueue.add(item)
//println("add : ${item.first()},${item.last()}")
//큐에들어간 작업은 대기리스트에서 삭제한다
deleteList.add(item)
}
}
}
//큐에들어간 작업은 대기리스트에서 삭제한다
jobsList.removeAll(deleteList)
//작업이 끝난 작업을 processingJob에서 삭제한다
if (i == currentProcessEndTime) {
//요청시간과 반환시간을 저장한다
val list = listOf(processingJob?.first(), i)
// println("list : +${list}")
result.add(list as List<Int>)
processingJob = null
}
// 큐에들어온 작업을 우선순위따라 뽑아서 작업한다 이미작업중이면 넘어간다
if (jobQueue.size != 0) {
if (processingJob == null) {
//지금들어온 작업의 예상종료시간을 저장한다
currentProcessEndTime = i + jobQueue.peek()[1]
// println("currentProcessEndTime: ${currentProcessEndTime}")
//작업스타트
processingJob = jobQueue.poll()
}
}
i++
// println("i : $i")
// println("processingJob")
// print("${processingJob?.first()} ,")
// print(processingJob?.last())
// println()
// println()
// println(currentProcessEndTime)
}
//println(result)
var sum=0
result.forEach {
sum += it[1] - it[0]
}
val temp = sum / jobs.size
return temp
}
}