홍시홍의 프로그래밍

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

알고리즘 문제풀이/프로그래머스

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

홍시홍 2020. 3. 30. 20:19

분류 : 힙

 

요구사항

SJF 구현

 

풀이

고려해야될게 생각보다 많은 문제 인듯하다

1. 우선순위 큐에 아무것도 없을때

- 다음 프로세스가 들어온 시간부터 시작한다

- 끝난 시간은 지금 들어온 프로세스가 끝난 시간이다

 

2. 우선순위 큐에 프로세스가 있을때

- 현재 작업이 지금 시간보다 이전에 온 작업인지 확인한다

- 이전에 온 작업이라면 큐에 넣어준다

 

3. 현재 작업을 종료해주고 다음 작업을 고른다

- 다음 작업은 작업시간이 가장 짧은 것중 제일 처음 들어온 것이다

 

단순구현 문제인데 예외처리가 어려웠다

 

#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
bool com(pair<int, int> a, pair<int, int> b) {
	if (a.second < b.second) { return true; }
	else if (a.second == b.second) {
		if (a.first < b.first) return true;
	}
	return false;
}

int solution(vector<vector<int>> jobs) {
	int answer = 0;
	vector<int> dist;
	sort(jobs.begin(), jobs.end());
	//q는 작업 시간, 들어온 시간 
	priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int>> >    q;

	// jobs는 들어온 시간, 작업 시간
	int Time = 0;
	int OutTime = 0;
	for (int i = 0; i < jobs.size(); i++) {
		cout << "answer" << answer << endl;
		//현재 시간보다 들어온 시간이 크다면
		cout << jobs[i][0] << endl;
		if (Time <= jobs[i][0]) {
			cout << "A" << endl;
			Time = (jobs[i][0] + jobs[i][1]);
			answer += jobs[i][1];
			continue;
		}
		//현재시간 이전에 들어온 작업이라면
		else if (Time > jobs[i][0]) {
			cout << "Time " << Time << endl;
			int flag = 0;
			for (int j = i; j<jobs.size(); j++) {
				if (Time >= jobs[j][0]) {
					if (flag == 1) i++;
					cout << "d" << endl;
					q.push({ jobs[j][1],jobs[j][0] });
					flag = 1;
				}
				else break;
			}
		}
		//다음으로 넘어가기전에 작업을 처리해주어야한다
		while (!q.empty()) {
			if (i + 1 < jobs.size()) {
				if (Time > jobs[i + 1][0]) { cout << "!!!" << endl; break; }
			}
			cout << "C" << endl;
			// 작업 시간
			int nowburst = q.top().first;
			// 들어온 시간
			int nowstart = q.top().second;
			q.pop();
			Time += nowburst;
			answer += (Time - nowstart);
			cout << "Nowburst " << nowburst << " nowstart " << nowstart << " " << Time << " " << answer << endl;
		}
	}
	answer = answer / jobs.size();
	return answer;
}
Comments