반응형
회사에서 코드를 짤 때는 주로, Comparable을 구현해서 활용하거나 Comparator를 생성했다.
다른 코드를 보니까 ㅜ 부족함이 많이 느껴진다.
풀이
- 작업 요청 시간이 지난 작업 중, 작업 시간이 짧은 것부터 처리하도록 한다. -> 작업 시간을 기준으로 우선순위 큐 사용.
(대기하는 작업들의 대기 시간을 줄인다는 느낌)
개선점 1. 굳이 객체를 생성할 필요는 없었다.
개선점 2. compare 및 sorting 시에 람다 함수 활용.
더보기
나의 풀이...
import java.util.PriorityQueue;
import java.util.Comparator;
class Solution {
public int solution(int[][] jobs) {
int size = jobs.length;
PriorityQueue<Job> pqTimeFirst = new PriorityQueue<>(new Comparator<Job>() {
@Override
public int compare(Job o1, Job o2) {
if(o1.getTiming() == o2.getTiming()){
return o1.due-o2.due;
}
return o1.getTiming() - o2.getTiming();
}
});
for (int[] job : jobs) {
Job j = new Job(job[0], job[1]);
pqTimeFirst.add(j);
}
PriorityQueue<Job> readyPQ = new PriorityQueue<>();
Job job = pqTimeFirst.poll();
int time = job.getTiming();
int sum = 0;
while (true) {
time += job.getDue(); // 작업시간을 더해줌.
sum += time - job.getTiming(); // 작업끝난시점 - 작업 시작 시점.
System.out.println(time + " sum " + sum);
if(pqTimeFirst.isEmpty() && readyPQ.isEmpty())break;
while (!pqTimeFirst.isEmpty()&& pqTimeFirst.peek().getTiming() <= time) {
readyPQ.add(pqTimeFirst.poll());
}
//당장 실행 할 수 있는게 없을 때.
if(readyPQ.isEmpty()){
job=pqTimeFirst.poll();
time=job.getTiming();// 다음 요청으로 넘어간다.
}
else job = readyPQ.poll();
}
return sum/size;
}
class Job implements Comparable<Job>{
int timing;
int due;
public Job(int t, int d) {
this.timing=t;
this.due=d;
}
@Override
public int compareTo(Job o) {
return this.due-o.due;
}
public int getTiming() {
return timing;
}
public int getDue() {
return due;
}
}
}
직접 타이핑하므로써 제대로 읽어보기 위해 베껴왔다...
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++; // 처리 완료 작업 수 증가.
} else{ // 이전 작업 처리 중 요청된 작업 없는 경우.
end_time = jobs[jobs_index][0]; // 다음 작업 요청 시점으로 갱신.
}
}
return answer/jobs.length;
반응형
'코딩 테스트' 카테고리의 다른 글
[LeetCode] 2. Add Two Numbers - Medium (0) | 2023.02.15 |
---|---|
[LeetCode] 1. Two Sum - Easy (0) | 2023.02.15 |
[코딩테스트] 프로그래머스 : 주식가격 (0) | 2022.12.05 |
[코딩테스트] 프로그래머스 : 프린터(python) (1) | 2022.11.30 |
[코딩테스트] 프로그래머스 : 위장, Counter 사용법 (0) | 2022.11.30 |
댓글