Make Unreal REAL.
article thumbnail
Level 3. 디스크 컨트롤러

 

 

처음에 소요 시간으로만 정렬해 시작 시간을 빼 더하면 되는 줄 알았는데, 그게 아니어서 설명이 잘 돼 있는 이 블로그를 참고했다.

 

 

프로그래머스_힙(Heap)_디스크 컨트롤러 (JAVA)

문제 설명 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입

codevang.tistory.com

 

소요 시간으로 정렬하되, 현재까지 소요된 시간들을 더해 그 중에서도 수행할 수 있는 가장 빠른 시작 시간을 가진 작업을 선택해야 하는 문제였다.

 

생각 외로 쉽지 않았다..

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <numeric>

using namespace std;

struct Job
{
    int start;
    int duration;
};

class compare
{
public:
    bool operator()(const Job& A, const Job& B) { return A.duration > B.duration; }
};

int solution(vector<vector<int>> jobs)
{
    vector <int> answer;
    priority_queue<Job, vector<Job>, compare> minHeap;
    vector<Job> sortedJobs;
    int currentStart = 0, i = 0;

    for (auto& job : jobs)
        sortedJobs.emplace_back(Job{job[0], job[1]});

    sort(sortedJobs.begin(), sortedJobs.end(), [](Job& A, Job& B) { return A.start < B.start; });

    while (i < sortedJobs.size())
    {
        if (minHeap.empty())
            currentStart = max(currentStart, sortedJobs[i].start);

        while (i < sortedJobs.size() && sortedJobs[i].start <= currentStart)
            minHeap.emplace(Job{sortedJobs[i].start, sortedJobs[i].duration}),
            ++i;

        answer.emplace_back((currentStart += minHeap.top().duration) - minHeap.top().start);
        minHeap.pop();
    }

    while (!minHeap.empty())
    {
        answer.emplace_back((currentStart += minHeap.top().duration) - minHeap.top().start);
        minHeap.pop();
    }

    return accumulate(answer.begin(), answer.end(), 0) / answer.size();
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 미로 탈출  (0) 2023.07.24
Level 2. 메뉴 리뉴얼  (0) 2023.07.23
Level 3. 야근 지수  (0) 2023.07.21
Level 2. 수식 최대화  (0) 2023.07.20
Level 2. 테이블 해시 함수  (0) 2023.07.19
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그