Skip to content

Commit

Permalink
이슈 #409에서 솔루션 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Dec 2, 2024
1 parent e1ade24 commit b7bb5f0
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions Programmers/디스크_컨트롤러.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

struct Job {
int start;
int length;
int index;

Job(int s, int l, int i) : start(s), length(l), index(i) {}
};

struct CompareJob {
bool operator()(const Job& a, const Job& b) {
if (a.length != b.length) return a.length > b.length;
if (a.start != b.start) return a.start > b.start;
return a.index > b.index;
}
};

int solution(vector<vector<int>> jobs) {
vector<Job> job_list;
for (int i = 0; i < jobs.size(); i++) {
job_list.push_back(Job(jobs[i][0], jobs[i][1], i));
}
sort(job_list.begin(), job_list.end(),
[](const Job& a, const Job& b) { return a.start < b.start; });

priority_queue<Job, vector<Job>, CompareJob> waiting_queue;
int current_time = 0;
int total_turnaround = 0;
int job_index = 0;

while (job_index < jobs.size() || !waiting_queue.empty()) {
// 현재 시점까지 요청된 모든 작업을 대기 큐에 추가
while (job_index < jobs.size() && job_list[job_index].start <= current_time) {
waiting_queue.push(job_list[job_index]);
job_index++;
}

if (waiting_queue.empty()) {
// 대기 큐가 비어있다면 다음 작업의 시작 시간으로 이동
current_time = job_list[job_index].start;
continue;
}

// 우선순위가 가장 높은 작업 실행
Job current_job = waiting_queue.top();
waiting_queue.pop();

// 작업 완료 및 반환 시간 계산
current_time += current_job.length;
total_turnaround += current_time - current_job.start;
}

return total_turnaround / jobs.size();
}

0 comments on commit b7bb5f0

Please sign in to comment.