짱아의 개발 기록장

프로그래머스. 디스크컨트롤러(c++) / 힙(Heap) 본문

Algorithm/Programmers

프로그래머스. 디스크컨트롤러(c++) / 힙(Heap)

jungahshin 2021. 1. 8. 19:27
반응형

[메인로직]

현재 시간(sec)이하의 요청 시간을 가지고 있는 작업들을 모두 최소 힙에 넣고 => 힙에 pair<작업시간, 요청시간> 형태로 저장했다.

그 중 가장 작은 작업 시간을 가지는 작업을 수행한다.

위의 로직을 모든 작업이 끝날때까지 반복하면 된다!

 

하지만!!!!! [[0 , 3], [4, 4], [5, 3], [4, 1]] 이 테스트케이스에서 오류가 발생했다.....

작업을 수행하면서 현재 시간을 sec += (작업의 소요시간) 으로 더해주었는데,,,,,,

위 케이스에서는 첫 번째 작업 수행 후, sec = 3이 되면 3이하의 요청시간을 가지는 작업이 하~~~나도 없기 때문에 의미없이 while문을 계속돌아서 TimeLimit이 발생한다.

따라서, 위와 같이 priority_queue에 아무것도 없을 경우에는 현재시간 sec를 다음 요청시간인 sec = 4로 갱신시켜주어야 한다!

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
 
using namespace std;
 
bool check[501];
int N = 0;
 
bool isAllDone(){
    for(int i=0; i<N; i++){
        if(check[i]==false){
            return false;
        }
    }
    
    return true;
}
 
 
int solution(vector<vector<int>> jobs) {
    int answer = 0;
    
    sort(jobs.begin(), jobs.end());
    
    int currentTime = jobs[0][0]+jobs[0][1];
    answer += jobs[0][1];
    check[0= true;
    int currentIdx = 0;
    N = jobs.size();
    
    while(!isAllDone()){
        priority_queue<pair<intint>vector<pair<intint>>, greater<pair<intint>>> pq;
        
        for(int i=0; i<N; i++){
            if(check[i]==truecontinue;
            if(currentTime>=jobs[i][0]){
                pq.push(make_pair(jobs[i][1], jobs[i][0]));
            }
        }
        
        if(pq.empty()){
            currentTime = jobs[currentIdx+1][0];
            continue;
        }
        
        int requestTime = pq.top().second;
        int runningTime = pq.top().first;
        pq.pop();
        answer += (currentTime+runningTime-requestTime);
        currentTime += runningTime;
        
        for(int i=0; i<N; i++){
            if(jobs[i][0]==requestTime && jobs[i][1]==runningTime){
                check[i] = true;
                currentIdx = i;
            }
        }
    }
    
    answer /= jobs.size();
    
    return answer;
}
cs
반응형
Comments