[문제]
출처 - https://programmers.co.kr/learn/courses/30/lessons/42627?language=java
[문제 풀이]
이 문제는 '우선순위 큐' 로 해결 할 수 있는 문제입니다.
현재 작업이 종료되기 전에 들어온 요청들을 작업의 소요시간이 짧은 순서대로 나열해야하기 때문입니다.
근데 이 문제에서는 작업이 요청되는 시점과 작업의 소요시간으로 주어집니다.
문제에서는 [0,3] [1,9] [2,6] 으로 요청되는 시점 순으로 들어왔지만 실제 문제는 그 순서가 지켜진다고 적혀있지 않습니다. 그래서 우선 요청되는 시점 순으로 배열을 정렬을 한뒤 문제에 주어진 대로 코드를 완성해야 합니다.
- 주어진 문제의 배열을 작업이 요청되는 시점이 짧은 순으로 정렬한다.
- 우선순위큐는 작업의 소요시간이 짧은 순으로 정렬한다.
- while문을 반복하는데 요청갯수를 0이라 설정하고 주어진 요청의 개수(배열의 길이)를 넘지 않게 반복한다.
- 현재 작업이 끝나기 전에 들어온 요청 개수를 우선순위 큐에 모두 넣는다.
- 큐에있는 작업을 진행시키면서 작업의 요청부터 종료까지 걸린 시간을 구하고 요청갯수를 증가시킨다.
[소스 코드]
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
int answer = 0;
int end = 0; //작업 수행직후 시간
int index = 0;
int count =0; //요청 갯수
//작업의 요청 시점 정렬
Arrays.sort(jobs, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
PriorityQueue<int[]> q = new PriorityQueue<int[]>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
while(count < jobs.length) {
while(index < jobs.length && jobs[index][0] <= end) {
q.add(jobs[index++]);
}
if(q.isEmpty()) {
end = jobs[index][0];
}else {
int[] temp = q.poll();
answer += temp[1] + end - temp[0];
end += temp[1];
count++;
}
}
return answer/jobs.length;
}
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스 Level2] 괄호 변환 (JAVA) - 2020 Kakao (0) | 2022.02.06 |
---|---|
[프로그래머스 Level2] 문자열 압축 (JAVA) - 2020 Kakao (0) | 2022.02.01 |
[프로그래머스 Level2] 더 맵게 (JAVA) (0) | 2022.01.12 |
[프로그래머스 Level2] 오픈채팅방 (JAVA) - 2019 Kakao (0) | 2022.01.11 |
[프로그래머스 Level2] 소수 찾기 (JAVA) (0) | 2022.01.04 |