본문 바로가기
알고리즘 문제풀이

[프로그래머스] 디스크 컨트롤러 (Swift)

by SiO2whocode 2022. 4. 29.
728x90

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

 

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

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

programmers.co.kr

heap

이지만 정렬로만 풀은 문제..

시뮬레이션이라고 하는게 더 맞지 않나..싶은

왜 이곳에 heap을 써야하지..싶은..문제였달까

 

접근 방법

최종 종료 시간을 앞당기는게 문제가 아니라 대기시간+처리시간의 평균을 줄이는게 목적이다.

즉 대기시간을 줄이는게 문제의 목적임

 

SJF : shortest job first 대로 풀면 될 것 같은 문제이다. ....

즉 이 문제를 풀이한 방법은 지금 시간에 실행할 수 있는 작업 중 소요시간이 가장 짧은, 소요시간이 같다면 가장 먼저 들어온 작업부터 실행하는 로직이다.

 

최초에 시작하는 것은 시작시간이 가장 이른 것 중에 처리시간이 가장 짧은 작업을 수행해야 한다.

그래서 시작시간을 우선 기준으로 정렬을 하고 첫번째 작업을 pop한다.

 

그리고 이제 처리시간이 짧은 순으로 배열을 정렬하고 시뮬레이션 시작

 

now라는 시간 변수를 갖고 시간을 더해가면서 while 문을 반복하여 각 작업의 소요시간의 합을 구하는 식이다.

 

소스코드

import Foundation

func solution(_ jobs:[[Int]]) -> Int {
    var sumOfProcessTime:Int = 0
    var now:Int = 0
    
    var sortedJobs:[[Int]] = jobs.sorted(by: { 
        $0[0] == $1[0] ? $0[1] < $1[1] : $0[0] < $1[0]
    })
        
    var task = sortedJobs[0]
    sortedJobs.removeFirst()
    sumOfProcessTime += task[1]
    now = task[0]+task[1]
    
    sortedJobs.sort(by: {
        $0[1] == $1[1] ? $0[0] < $1[0] : $0[1] < $1[1]
    })
    
    while !sortedJobs.isEmpty {
        var removeJob:Bool = false
        for i in 0..<sortedJobs.count {
            if sortedJobs[i][0] <= now {
                sumOfProcessTime += (now-sortedJobs[i][0]) + sortedJobs[i][1]
                now += sortedJobs[i][1]
                sortedJobs.remove(at:i)
                removeJob = true
                break
            }
        }
        if !removeJob {
            now += 1
        }
    }
    
    return sumOfProcessTime/jobs.count
}
728x90