📕알고리즘 문제/📝Programmers
[프로그래머스] Level 3 : 디스크 컨트롤러
주으기
2024. 11. 18. 09:09
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/42627
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
먼저, 모든 작업을 처리한, 총 ms를 구한다.
(기저사항, 모든 작업이 끝났는지 확인하기 위함)
요청은 무조건 먼저 들어오는 순으로 받아야 하기 때문에, 요청 시간을 기준으로 오름차순으로 정렬한다.
현재 시간과 현재 처리 중인 요청을 저장할 변수를 선언한다.
더 처리할 요청이 남아있고, 현재 시간에 요청이 있을 경우, 큐에 { 수행 시간, 요청 시간 }으로 넣는다.
이러면, 새 데이터가 들어오면 우선순위 큐에서 수행 시간을 기준으로 오름차순으로 정렬하여, 새 작업을 선택할 때마다, 현재 작업 요청이 들어와 있는 애들 중, 가장 수행 시간이 짧은 요청을 수행한다.
요청 수행은 기본적인 해당 요청을 처리하는 데 걸리는 시간 + 요청한 시점으로부터 지금까지 걸린 시간를 답에 더한다.
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 오름차순
int solution(vector<vector<int>> jobs) {
int Answer = 0, End = 0;
sort(jobs.begin(), jobs.end()); // 오름차순 정렬
// 모든 작업이 끝나는 시간
for (const auto& job : jobs)
{
End = max(End, job[0]);
End += job[1];
}
// 현재 시간, 처리된 요청
int ms = 0, Index = 0;
while (ms < End)
{
// 처리된 요청이 모두 대기중인 경우, 아직 요청할 시간이 아닌 경우
while (Index < jobs.size() && jobs[Index][0] <= ms)
{
// { 시간, 요청 } 순서로 우선순위 큐에 저장 (걸리는 시간이 짧은 순서대로 오름차순 정렬됨)
pq.push({ jobs[Index][1], jobs[Index][0] });
Index++;
}
if (!pq.empty())
{
// 요청을 처리하는 데 걸리는 시간 + 요청한 시점으로부터 현재 시간까지 대기한 시간
Answer += pq.top().first + (ms - pq.top().second);
ms += pq.top().first; // 한 번에 한 가지 요청만 처리할 수 있기 떄문에, 걸리는 시간만큼 더함
pq.pop();
}
else ms++;
}
return Answer / jobs.size();
}
728x90
반응형