Code in

프로그래머스 힙 디스크 컨트롤러 with Kotlin 본문

알고리즘 스터디_문제풀이

프로그래머스 힙 디스크 컨트롤러 with Kotlin

heyhmin 2020. 8. 12. 01:25

프로그래머스 부분 디스크 컨트롤러 문제입니다.

IntelliJ에서의 문제풀이입니다.

import java.util.PriorityQueue
// Kotlin은 JVM: Java Virtual Machine 을 사용하기 때문에 Java에서 import합니다.

val jobs: Array<IntArray> = arrayOf(intArrayOf(0, 3), intArrayOf(1, 9), intArrayOf(500, 6))
fun solution(jobs: Array<IntArray>): Int {
    var answer = 0
    var timer = 0 // 현재 시간
    // 0은 요청 시간, 1은 소요 시간

    val waitminHeap = PriorityQueue<IntArray>(compareBy({it[0]}, {it[1]}))
    // wait 에서는 요청 시간을 기준으로, 요청 시간이 같은 건 소요 시간을 기준으로 ASC sorting

    val workminHeap = PriorityQueue<IntArray>(compareBy({it[1]}, {it[0]}))
    // work 에서는 소요 시간을 기준으로, 소요 시간이 같은 건 요청 시간을 기준으로 ASC sorting
    jobs.forEach { waitminHeap.add(it) }

    while (!waitminHeap.isEmpty() || !workminHeap.isEmpty()){
        // wait, work 둘 중 하나라도 남은 데이터가 있다면 실행합니다.
        while (!waitminHeap.isEmpty() && waitminHeap.peek()[0] <= timer){
            // null pointer를 막아주고, wait의 요청 시간과 timer를 비교합니다.
            workminHeap.add(waitminHeap.poll())
            // 현재 시간인 timer보다 이르게 요청된 모든 wait을 work로 add합니다.
        }// wait -> work

        if (!workminHeap.isEmpty()){ // null pointer를 막습니다.
            timer += workminHeap.peek()[1] // time skip합니다. work이 끝난 시간으로
            answer += timer - workminHeap.peek()[0] 
            // work이 끝난 작업의 요청~종료 시간을 answer에 더합니다.
            workminHeap.poll()
            // work이 끝난 작업을 삭제합니다.
        }else if (!waitminHeap.isEmpty()) // null pointer를 막습니다.
            timer = waitminHeap.peek()[0] // time skip합니다. 가장 가까운 요청 시간으로
        
        //println("$timer $answer") // : print할 때 int + " " + int를 쉽게 하는 방법입니다.
    }

    return answer/jobs.size // 평균이므로 나눠줍니다.
}
fun main() {
    print(solution(jobs)) // 9
}

URL: https://programmers.co.kr/learn/courses/30/lessons/42627#

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를��

programmers.co.kr

 

Comments