https://school.programmers.co.kr/learn/courses/30/lessons/42627#
아 이거.. 진짜 문제를 이해하는데 좀 애먹었다..
일단 작업요청이 들어온 순서대로 정렬한 뒤에 그 요청 시간에 따라 수행해야 한다
그리고..
예를 들어서
작업1이 7초에 끝났는데 작업2가 10초에 들어오면,
현재 시간을 걍 7->10초로 훅 옮겨버리면 된다.
근데 난 그걸 다.. total에 넣어버려서 문제가 생겼었다.
jobs
를 요청시간 순서대로(오름차순) 정렬한다.jobs
를 순회하며, 현재 시간에 요청이 들어와있는 애들을 priority_queue
에 넣는다.priority_queue
에 할 일이 있으면 수행한다여기서 할 일은
현재 시간(curTime
), 총 소요시간(total
) 구하기
무조건 벡터의 두 번째 원소가 해당 작업의 소요시간이니까
현재 시간에 해당 작업의 소요시간을 더해주고, 요청이 들어온 시간을 빼주면 해당 작업의 소요시간이 된당.
우선순위큐에 냅다 다 넣은 다음 하나씩 해결하려고 해서 그런다.
현재 시간에 존재하는 요청사항/아직 안들어온 요청사항을 구분하지 못했다
좀 더 생각하기 ..
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
struct compareByProcess
{
bool operator()(const vector<int>& a, const vector<int>& b) const {
if(a[1] == b[1]) return a[0] > b[0];
return a[1] > b[1];
}
};
int solution(vector<vector<int>> jobs) {
int answer = 0;
priority_queue<vector<int>, vector<vector<int>>, compareByProcess> pq;
sort(jobs.begin(), jobs.end());
int curTime = 0;
int total = 0;
int idx = 0;
while(idx < jobs.size() || !pq.empty()) {
if (idx < jobs.size() && jobs[idx][0] <= curTime) {
pq.push(jobs[idx++]);
continue;
}
if (!pq.empty()) {
vector<int> curJob = pq.top();
curTime += curJob[1];
total += curTime - curJob[2];
pq.pop();
}
else {
curTime = jobs[idx][0];
}
}
answer = total / jobs.size();
return answer;
}
정보 감사합니다.