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

 

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

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

programmers.co.kr

 

level 3 , Heap 에 해당하는 문제입니다.

학부 수업시간 때, FIFO 부터 시작해서 OS 컨트롤러를 공부할 때 접해봤던 비슷한 문제입니다.

 

평균시간을 줄이기 위해 접근한 방법은

대기큐에 있는 작업 중에서! 가장 수행시간이 짧은 것 부터 처리하는 것! 으로 접근해봤습니다.

 

좀더 자세한 설명은 코드와 함께 주석으로 설명하였습니다.

 

#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

typedef pair<int, int> pii;

int solution(vector<vector<int>> v) {
    int answer = 0;
    int time = 0;

    // 우선 큐에 대기 중인 프로세스 중에서 소요시간이 가장 짧은 것들을 우선적으로 처리하도록 접근
    // => 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.
    // 힙의 조건은 시간을 우선적으로 처리하되, 시간이 동일하면 사용시간이 짧은 녀석을 먼저 가져온다

    priority_queue<pii, vector<pii>, greater<pii> > q;

    // 내 나름 사용하기 편하게 변경
    vector<pii> jobs;
    for (int i = 0; i < v.size(); i++)
        jobs.push_back({ v[i][0], v[i][1] });
    
    // jobs의 값이 작업요청 순서대로 들어왔다는 말이 없으므로 정렬부터 함
    sort(jobs.begin(), jobs.end());

    // 먼저 들어온 작업부터 처리
    time = jobs[0].first + jobs[0].second;
    answer = jobs[0].second;
    
    int finish_task = 1;
    int task = 1;
    
    while(finish_task < jobs.size()){
        // 현재 time 까지 요청이 들어온 작업들을 큐에 넣고 작업
        for(int i = task; i < jobs.size(); i++){
            if(jobs[i].first <= time){
                // greater 로 꺼낼때 작업시간이 짧은 순으로 꺼내기 위해 swap 해서 푸쉬
                q.push({jobs[i].second, jobs[i].first});
                task++;
           }
            // time 보다 후에 들어온 작업은 우선처리 조건에 포함되지 않음
            else break;
        }
        
        // 현재 대기큐에 작업이 없다 -> 다음 작업을 가져옴 task        
        if(q.empty()){
            time = jobs[task].first+jobs[task].second;
            answer += jobs[task++].second;
            finish_task++;
        }
        // 현재 대기큐에 작업이 있다
        else{
            pii now_task = q.top();
            q.pop();
            finish_task++;
            answer += (time - now_task.second) + now_task.first;
            time += now_task.first;
        }
    }

    return answer/jobs.size();
}

'algorithm > programmers' 카테고리의 다른 글

Programmers 가사 검색  (0) 2020.12.09
Programmers 블록 이동하기  (0) 2020.12.08
Programmers 카펫 C++  (0) 2020.07.03
Programmers 숫자 야구 C++  (0) 2020.07.03
Programmers 소수 찾기 C++  (0) 2020.07.03

+ Recent posts