본문 바로가기

알고리즘/프로그래머스

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

반응형

디스크 컨트롤러


1. 이해하기

  • 하드디스크는 한 번에 하나의 작업만 수행할 수 있다.
  • 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리할때 평균을 구하는 문제.

2. 구현하기

  • 우선순위 큐를 이용하여 처리 시간이 가장 짧은 것부터 처리하게 한다.

    • 이때 큐를 이용하면 원하는 위치의 삭제가 힘드니 우선순위 큐의 결과를 벡터에 담는다.
    priority_queue<pair<int,int>> pq;
    for(int i = 0; i < jobs.size(); i++)
        pq.push({-jobs[i][1],jobs[i][0]});
    vector<pair<int,int>> job;
    for(int i = 0; i < jobs.size(); i++) {
        job.push_back(pq.top());
        pq.pop();
    }
  • 시간과 일의 시작시간을 비교하여 시작시간이 적거나 같은 경우에 그 일을 처리한다.

    • 아무일도 시작할 수 없을 때는 시간을 증가시켜준다. 디스크가 비어있는 시간이 있을 수도 있기 때문이다.
    int time = 0;
    while(job.size() > 0) {
        for(int i = 0; i < job.size(); i++) {
            if(time >= job[i].second) {
                time += -job[i].first;
                answer += time-job[i].second;
                job.erase(job.begin()+i);
                break;
            }
            if(i == job.size()-1) time++;
        }
    }

3. 전체 코드

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

int solution(vector<vector<int>> jobs) {
    int answer = 0;
    priority_queue<pair<int,int>> pq;
    for(int i = 0; i < jobs.size(); i++)
        pq.push({-jobs[i][1],jobs[i][0]});
    vector<pair<int,int>> job;
    for(int i = 0; i < jobs.size(); i++) {
        job.push_back(pq.top());
        pq.pop();
    }

    int time = 0;
    while(job.size() > 0) {
        for(int i = 0; i < job.size(); i++) {
            if(time >= job[i].second) {
                time += -job[i].first;
                answer += time-job[i].second;
                job.erase(job.begin()+i);
                break;
            }
            if(i == job.size()-1) time++;
        }
    }
    return answer/jobs.size();
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 여행경로  (0) 2019.11.20
[프로그래머스] 예산  (0) 2019.11.18
[프로그래머스] 가장 먼 노드  (0) 2019.11.18
[프로그래머스] 단어 변환  (0) 2019.11.18
타일 장식물  (0) 2018.11.02