Search
Duplicate
📒

[Programmers] 03-2. 디스크 컨트롤러 ⭐

상태
완료
수업
Algorithm Solving
주제
Programmers
4 more properties
참고

문제해설

NOTE
입력값 ⇒ 이차원 정수배열(작업의 순서, 작업의 시간)
출력값 ⇒ 모든 작업을 처리하는데 가장 효율적인 평균시간

문제 로직고민

NOTE
처음 문제를 읽고 선점방식의 스케쥴링인줄 알고 상당히 애먹었다..
진행중인 job은 교체되지 않으며, 완전히 끝날때까지 다른 작업을 하지 않는다.
모든 작업의 마무리되는 평균 처리 시간을 줄인다 ⇒ 처리량이 빠른것부터 처리한다.
처리가 늦은 작업을 앞에두면, 빠른 처리량을 가진 작업도 그 시간만큼 느려지게됨

작성코드

NOTE
import java.util.*; class Solution { public int solution(int[][] jobs) { Arrays.sort(jobs, (a,b) -> a[0] - b[0]); PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); int answer = 0; int index = 0; // jobs 배열의 idx int count = 0; // 수행된 요청 개수 int time = 0; // 수행되고난 직후의 시간 // 모두 처리할때까지 while(count < jobs.length){ // 하나의 작업이 완료되는 시점(time) 까지 들어온 모든 요청을 큐에 넣음 while(index < jobs.length && jobs[index][0] <= time) pq.add(jobs[index++]); // pq가 비어있다 => 넣을 작업이없으므로 다음 작업의 시작시간까지 이동 if(pq.isEmpty()) time = jobs[index][0]; // pq가 존재한다 => 넣을 작업이 있으므로 처리해줌 else{ int[] cur = pq.poll(); answer += cur[1] + time - cur[0]; time += cur[1]; count++; } } return answer / jobs.length; } }
Java
복사

다른사람 풀이

NOTE
import java.util.Arrays; import java.util.PriorityQueue; class Solution { public int solution(int[][] jobs) { int answer = 0; // 작업이 요청되는 시점 기준으로 오름차순 정렬 Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]); // 작업의 소요시간 기준으로 오름차순 정렬 PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); int jobs_index = 0; // 작업 배열 인덱스 int finish_job = 0; // 처리 완료된 작업 개수 int end_time = 0; // 작업 처리 완료 시간 while(true) { if(finish_job == jobs.length) break; // 모든 작업을 처리했다면 종료 // 이전 작업 처리 중 요청된 작업 add while(jobs_index < jobs.length && jobs[jobs_index][0] <= end_time) { pq.add(jobs[jobs_index++]); } if(!pq.isEmpty()) { // 이전 작업 처리 중 요청된 작업이 있는 경우 int[] job = pq.poll(); answer += end_time - job[0] + job[1]; // 작업 요청부터 종료까지 걸린 시간 추가 end_time += job[1]; // 작업 처리 완료 시간 갱신 finish_job++; // 처리 완료된 작업 개수 1 증가 } else { // 이전 작업 처리 중 요청된 작업이 없는 경우 end_time = jobs[jobs_index][0]; // 다음 작업 요청 시점으로 갱신 } } return answer / jobs.length; } }
Java
복사
비슷한 방법
결국 풀이 방식은 우선순위 큐를 사용하는것이 중요.