[Programmers] 디스크 컨트롤러

김토리·2024년 9월 29일

알고리즘

목록 보기
20/27


이렇게 A → C → B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.

각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)

제한 사항

  • jobs의 길이는 1 이상 500 이하입니다.
  • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
  • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
  • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.
#include <string>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

bool comp(const vector<int> &a,const vector<int> &b){
      return a[1] <= b[1];//작업시간이 짧은 순서대로
}  

int solution(vector<vector<int>> jobs) {
    int answer = 0,cnt=jobs.size(), time = 0 ;
    
    sort(jobs.begin(), jobs.end(),comp); //소요시간이 짧은 순서대로 정렬
    
    while(!jobs.empty()){ //모든 작업을 수행할 때 까지 실행
        
        for(int i = 0 ; i < jobs.size() ; i ++){
            if(jobs[i][0]<=time){   //현재 시간이 작업이 요청되는 시간과 같거나 클때만 
                time+=jobs[i][1];
                answer+=(time - jobs[i][0]);
                jobs.erase(jobs.begin() + i);
                break;
            }
            //작업을 수행할 수 없으면 현재시간에 +1
            if(i == jobs.size() -1) time++;
        }
    }
    
    return answer/cnt;
}

아래는 time에 대한 공회전을 최소화 했을 때에 대한 복잡도를 비교한 것

기존코드

=> 처음엔 어떻게 접근해야할 지 조금 막막했는데 전에 알고리즘 스터디하면서 풀었던 기억이 조금씩 났다.
이 방법 말고도 priority_queue를 사용한 방법도 있다.

profile
웹 개발하며 데이터 분석, AI 공부하는 jinveloper

0개의 댓글