[프로그래머스 Lv3] 디스크 컨트롤러

수민이슈·2023년 7월 31일
0

[C++] 코딩테스트

목록 보기
39/116
post-thumbnail

🖊️ 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42627#


🖊️ 풀이

아 이거.. 진짜 문제를 이해하는데 좀 애먹었다..
일단 작업요청이 들어온 순서대로 정렬한 뒤에 그 요청 시간에 따라 수행해야 한다
그리고..
예를 들어서
작업1이 7초에 끝났는데 작업2가 10초에 들어오면,
현재 시간을 걍 7->10초로 훅 옮겨버리면 된다.
근데 난 그걸 다.. total에 넣어버려서 문제가 생겼었다.

어케햇냐면

  1. jobs 를 요청시간 순서대로(오름차순) 정렬한다.
  2. 정렬된 jobs를 순회하며, 현재 시간에 요청이 들어와있는 애들을 priority_queue에 넣는다.
    (현재 시간에 들어온 수행해야 할 애들)
  3. 그리고 priority_queue에 할 일이 있으면 수행한다
  4. 할 애들 다 하면 됨.

여기서 할 일은
현재 시간(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;
}

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

정보 감사합니다.

답글 달기