📌 Heap
⭐️ 우선순위 큐
시작 시간 = 요청 시점
, 종료 시점 = 시작 시간 + 실행 시간
으로 갱신시작 시간 = 요청 시점
, 종료 시점 = 현재 시점 + 실행 시간
으로 갱신히프라는데 어쩌라는지 모르겠어서 얼레벌레 구현했다. 프로그래머스에서 요구하는 히프 문제는 우선순위 큐 활용 문제인듯
이런 문제가 또 나오면 어찌할지 모르겠엄,,
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
struct task {
int st;
int len;
};
struct cmp1 {
bool operator()(task t1, task t2) {
if(t1.st==t2.st) {
return t1.len>t2.len;
}
return t1.st>t2.st;
}
};
struct cmp2 {
bool operator()(task t1, task t2) {
return t1.len>t2.len;
}
};
int solution(vector<vector<int>> jobs) {
int answer = 0;
// 요청 순서 빠른 순(요청 시점,시간)
priority_queue<task,vector<task>,cmp1> pq_early;
// 시간 짧은 순
priority_queue<task,vector<task>,cmp2> pq_short;
for(int i=0;i<jobs.size();i++) {
pq_early.push({jobs[i][0],jobs[i][1]});
}
int cnt=0, e=0;
while(1) {
if(pq_early.empty() && pq_short.empty()) break;
int cur,idx,len;
while(!pq_early.empty()) {
cur=pq_early.top().st;
if(cur>e) break;
len=pq_early.top().len;
pq_early.pop();
pq_short.push({cur,len});
}
int next;
// 새로운 task 시작
if(pq_short.empty()) {
// 요청 빠른 것 시작
next=pq_early.top().st;
len=pq_early.top().len;
pq_early.pop();
cnt=next;
e=cnt+len;
answer+=(e-cnt);
}
else {
// 대기 큐에 있는 것 넣기
next=pq_short.top().st;
len=pq_short.top().len;
pq_short.pop();
cnt=next;
e+=len;
answer+=(e-cnt);
}
}
return answer/jobs.size();
}