diff --git "a/Programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.cpp" "b/Programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.cpp" new file mode 100644 index 0000000..cec0239 --- /dev/null +++ "b/Programmers/\353\224\224\354\212\244\355\201\254_\354\273\250\355\212\270\353\241\244\353\237\254.cpp" @@ -0,0 +1,59 @@ +#include +#include +#include + +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> jobs) { + vector 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, 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(); +} \ No newline at end of file