일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 락
- 동적계획법
- 스케줄링
- 디자인패턴
- directx
- Direct12
- 그리디 알고리즘
- 영속성
- 그리디알고리즘
- I/O장치
- 타입 객체
- OS
- 렌더링 파이프라인
- 병행성 관련 오류
- 다이나믹 프로그래밍
- 파일시스템 구현
- 멀티쓰레드
- 프로그래머스
- DirectX 12
- 컨디션 변수
- 다이나믹프로그래밍
- 백준
- 쓰레드
- DirectX12
- 멀티프로세서
- 운영체제
- codility
- 자료구조
- 알고리즘
- 병행성
Archives
- Today
- Total
기록공간
디스크 컨트롤러 (프로그래머스) 본문
반응형
평균 시간이 가장 최소가 되기 위해서는 각 작업 소요시간 순으로 처리하면 된다. 여기에는 요청이 먼저 들어온 순서도 고려를 해줘야 한다.
여기서 가장 중요한 부분은 이것이다. 이것을 놓치면 계속해서 실패가 나올 것이다.
-
하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.
현재 작업 시간에 들어온 작업 요청이 없다면 먼저 요청이 들어오는 작업의 시간대로 점프해야 한다. 이 공백 부분을 놓치면 이 문제는 항상 다른 결과를 반환할 것이다.
알고리즘 풀이 과정은 다음과 같다.
-
요청 받은 작업들을 요청 시간을 기준으로 오름차순 정렬한다.
-
소요시간을 기준으로 하는 최소 힙을 만든다.
-
현재 작업 시간 0부터 시작한다.
-
작업 요청 시간이 현재 작업 시간 내에 있다면 그 작업을 최소 힙에 넣는다.
-
만약 없다면, 그 시점으로 부터 먼저 요청이 들어오는 작업으로 현재 작업 시간을 점프한다.
-
힙이 빌때까지 힙에서 작업을 꺼내어 처리하고 요청부터 종료까지의 시간을 기록한다.
-
기록한 시간을 작업의 개수로 나누어 평균을 구한다.
코드는 다음과 같다.
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
// 소요시간을 기준으로 최소힙을 만들기 위한 조건
struct cmp
{
bool operator()(const vector<int>& a, const vector<int>& b)
{
return a[1] > b[1];
}
};
int solution(vector<vector<int>> jobs) {
int answer = 0;
// 요청이 들어온 순으로 정렬한다.
sort(jobs.begin(), jobs.end());
priority_queue<vector<int>, vector<vector<int>>, cmp> pq;
int idx = 0, stack = 0;
while(true)
{
// 처리할 작업이 없는 경우 반복문을 빠져나온다.
if(idx >= jobs.size() && pq.empty()) break;
// 처리할 작업이 있는 경우 먼저 요청이 들어온 작업부터 처리
if(idx < jobs.size() && jobs[idx][0] <= stack)
{
pq.push(jobs[idx++]);
continue;
}
if(!pq.empty())
{
// 소요 시간 순으로 작업을 처리한다.
// 소요 시간을 기록해 놓는다.
stack += pq.top()[1];
answer += stack - pq.top()[0];
pq.pop();
}
else
// 처리할 작업이 있는데도 불구하고 요청이 없는경우 요청이 들어오는 시점으로 점프한다.
stack = jobs[idx][0];
}
// 평균 소요 시간을 반환한다.
return answer / jobs.size();
}
반응형
'Algorithm > 문제' 카테고리의 다른 글
다리를 지나는 트럭 (프로그래머스) (0) | 2020.05.24 |
---|---|
여행경로 (프로그래머스) (0) | 2020.05.23 |
라면공장 (프로그래머스) (0) | 2020.05.20 |
타일 장식물 (프로그래머스) (0) | 2020.05.19 |
비밀지도 (프로그래머스) (0) | 2020.05.16 |
Comments