반응형

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

 

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

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

programmers.co.kr

 

각 요청 시간에 따른 작업을 기록해놓고, 각 작업이 끝날 때마다 그 사이에 들어온 요청들을 우선순위 큐를 이용하여 최소 시간이 걸리는 작업 순으로 정렬해주었습니다.

만약 새로이 작업할 것이 없다면, 다음 요청을 받아냈습니다.

 

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

vector<vector<int>> request(1001, vector<int>());
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

int getNotEmptyIdx(int t) { // t 다음으로 비어있지 않은 인덱스
    for(int i=t+1; i<1001; i++) 
        if(request[i].size() != 0) return i;
    return -1;
}

void fillTask(int requestTime) {
    for(int i=0; i<request[requestTime].size(); i++)
        pq.push({request[requestTime][i], requestTime});
}

int solution(vector<vector<int>> jobs) {
    for(int i=0; i<jobs.size(); i++)
        request[jobs[i][0]].push_back(jobs[i][1]);

    int total = 0, startTime = getNotEmptyIdx(-1);
    
    for(int i=0; i<request[startTime].size(); i++)
        pq.push({request[startTime][i], startTime});

    while(!pq.empty()) {
        int time = pq.top().first;
        int rtime = pq.top().second;
        pq.pop();
        for(int i=startTime+1; i <1001 && i<=startTime+time; i++) // 현재 작업 마치는 시간까지 들어온 새로운 요청
            fillTask(i);
        
        startTime += time;
        total += startTime - rtime; 
        
        if(pq.empty()) { // 들어온 작업이 없다면 다음 작업 요청
            startTime = getNotEmptyIdx(startTime);
            if(startTime == -1) break;
            fillTask(startTime);
        }
    }
    return total / jobs.size();
}
 
 
반응형

'Algorithm' 카테고리의 다른 글

백준 1946 : 신입 사원  (0) 2021.11.14
프로그래머스 : 합승 택시 요금  (0) 2021.11.14
프로그래머스 : 더 맵게  (0) 2021.11.14
프로그래머스 : 카펫  (0) 2021.11.14
프로그래머스 : 전화번호 목록  (0) 2021.11.14

+ Recent posts