우선순위 큐를 원하는 대로 정렬하는 방법에 대해 알게되는 문제였다. 아래 예시와 같이 구조체에 operator함수를 만들어서 비교하는 방식으로 구현할 수 있다. 이외에도 문제자체가 좀 난해해서 다른 풀이들을 참조하였다. 여러번 풀면서 완전히 체득하는 편이 좋을것같아보이는 문제이다.
struct compare { bool operator()(vector<int> a, vector<int> b) { return a[1] > b[1]; } }; int solution(vector< vector<int> > jobs) { priority_queue< vector<int>, vector< vector<int> >, compare> pq; }
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
struct compare
{
bool operator()(vector<int> a, vector<int> b)
{
return a[1] > b[1];
}
};
int solution(vector< vector<int> > jobs)
{
int answer = 0, n = jobs.size();
priority_queue< vector<int>, vector< vector<int> >, compare> pq;
int cur = 0, cnt = 0;
sort(jobs.begin(), jobs.end());
while (cnt < n || !pq.empty())//작업이 남아있거나 pq에 남아있는 작업이 있다면
{
if (cnt < n && jobs[cnt][0] <= cur)// 현재 시간보다 작업의 요청시간이 같거나 작다면 && 작업이 남아있다면
{
pq.push(jobs[cnt++]);
continue;// 현재 시간보다 요청 시간이 작은 작업이 여러개일때를 위해
}
if (!pq.empty())// 현재 시간보다 요청시간이 작은 작업들중
{
cur += pq.top()[1];// 현재시간에 작업들중 가장 작업시간이 작은 시간++
answer += cur - pq.top()[0];// 현재까지 작업한 시간 - 해당 작업 요청시간을 전체 시간에 ++
pq.pop();
}
else cur = jobs[cnt][0];// 현재 시간 갱신
}
return answer/n;
}