728x90
https://programmers.co.kr/learn/courses/30/lessons/42627
코딩테스트 연습 - 디스크 컨트롤러
하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를
programmers.co.kr
- 문제

문제 1 
문제 2 
문제 3 
문제 4
풀이
- 시작 시준을 기준으로 배열을 정렬한다
- 우선순위 큐를 선언한다
- 실행시간이 짧은 순으로 꺼내지도록 우선순위 큐를 정의한다.
- 반복문(모든 데이터를 처리했을 때까지 , count변수 == jobs.length까지...)
- 시간 변수를 하나 선언 한 뒤 시간 변수 전에 시작되는 모든 값들의 우선순위 큐에 넣는다.
- 만약 우선순위 큐가 비었을 경우
- 만약 [[1,2], [2,4], [6,8]] 이러한 데이터를 가지고 진행한다고 했을 때, 4초부터 6초까지 2초간의 텀을 계산하기 위한 경우의 수이다.
- 비어있지 않을 경우
- 우선순위 큐에 담겨 있는 값을 꺼낸 뒤 대 현재시간에 + 프로세스 진행시간을 더해준 뒤 , 대기시간을 더해준다.
- 글로 쓰려고 하니까 설명하기 힘들지만 코드를 보면 이해하기 쉽다.
-
class Disk{ int startTime; // 시작 시간 int processTime; // 프로세스 진행 시간 public Disk(int startTime,int processTime) { this.processTime = processTime; this.startTime = startTime; } } public static int solution(int[][] jobs) { int answer = 0; Arrays.sort(jobs,(o1,o2)->{ // 시작 시간을 기준으로 정렬 if(o1[0] == o2[0]) return o1[1] - o2[1]; return o1[0] - o2[0]; }); Queue<Disk> pq = new PriorityQueue<>((o1,o2)->{ // 프로세스 진행이 짧은 순으로 정렬 return o1.processTime - o2.processTime; }); int startIdx = 0; // 현재 시간에 진행가능한 배열 까지의 index int count = 0;//총 갯수 => count가 배열을 끝까지 돌아야된다. int now = 0;//현재 시간 while(count < jobs.length) {// 배열 마지막 요소까지 돌아라 while(startIdx < jobs.length && jobs[startIdx][0] <= now) { // 현재 시간에서의 진행가능한 배열을 요소까지 우선순위 큐에 넣어준다. pq.offer(new Disk(jobs[startIdx][0], jobs[startIdx][1])); startIdx++; } if(pq.isEmpty()) {//만약 우선순위 큐가 비어 있다면, 배열에 현재시간보다 작은것이 없다면 현재 시간을 배열 요소로 초기화 now = jobs[startIdx][0]; }else { Disk d = pq.poll();//우선순위 큐에 존재하는 실행시간이 가장 작은 디스크를 꺼낸뒤 now += d.processTime; // 현재시간에 실행 시간만큼 더해준다, answer += now - d.startTime; // 총 대기시간에 현재시간 + 실행 시간 - 시작시간 count++;//하나 처리 완료 } } return answer/jobs.length; }
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| LEVEL 3 : 정수 삼각형 (0) | 2021.11.26 |
|---|---|
| LEVEL 3 : 리틀 프렌즈 사천성 (0) | 2021.11.25 |
| LEVEL 3 : [1차] 추석 트래픽 (0) | 2021.11.24 |
| LEVEL 3 : 등굣길 (0) | 2021.11.23 |
| LEVEL 3 : N으로 표현 (0) | 2021.11.23 |