공부기록
디스크 컨트롤러 본문
- 문제
https://programmers.co.kr/learn/courses/30/lessons/42627
- 코드
더보기
import java.util.*;
class Solution {
class Job{
public int s_t;
public int r_t;
public Job(int s_t, int r_t){
this.s_t = s_t;
this.r_t = r_t;
}
}
public int solution(int[][] jobs) {
int answer = 0;
ArrayList<Job> jobArr = new ArrayList<>();
PriorityQueue<Job> pq = new PriorityQueue<>(new Comparator<Job>(){
@Override
public int compare(Job ob1, Job ob2){
return ob1.r_t - ob2.r_t;
}
});
for(int i=0; i<jobs.length; i++){
jobArr.add(new Job(jobs[i][0], jobs[i][1]));
}
Collections.sort(jobArr, new Comparator<Job>(){
@Override
public int compare(Job ob1, Job ob2){
return ob1.s_t - ob2.s_t;
}
});
int cur_time = jobArr.get(0).s_t;
int cursor = 0;
int cnt = 0;
while(cnt < jobs.length){
while(cursor < jobArr.size() && jobArr.get(cursor).s_t <= cur_time){
pq.add(jobArr.get(cursor++));
}
if(!pq.isEmpty()){
Job cur_job = pq.poll();
cur_time += cur_job.r_t;
answer += (cur_time-cur_job.s_t);
cnt++;
}else{
cur_time++;
}
}
return answer/jobs.length;
}
}
- 피드백
- 알고리즘 도출까지는 성공했다.
- work들을 들어온 순으로 sort하고
- 시간 별로 pq에 넣으면서 최소 length를 가지는 work를 빼내면서 결과를 낸다.
- 문제는 구현을 못함... (컨디션 탓인 것 같다. 문제 풀때 굉장히 피곤했음)
- 금방 생각 못한 구현은 다음과 같다.
- new Comprator<Job>(){... public int compare(ob1, ob2) { } }
- 익명 클래스를 구현하여 compare custom을 할 수 있음. 자바 문법을 제대로 몰랐음... 기억하자.
- Collection.sort(list, new Comparator<>())
- PriorityQueue<Job>(new Comparator<>()))
- compare(ob1, ob2) 일 때, ob1.val - ob2.val 이 오름차순이라는 것을 기억하자.
- 루프 exit 조건
- 현재 시간을 세면서 현재 시간 이전의 아직 평가하지 못한 Job들을 pq에 넣어야했다.
- 이것을 위해 loop을 걸고 cur_time을 증가시키면서 넣기만 하면 되는데 문제는 loop 탈출 조건을 생각을 제대로 못함
- 그냥 모든 Job이 튀어 나왔으면 끝내면 된다.
- 그것은 cnt를 써서 지금까지 튀어나온 Job을 생각해주면 되었다.
- 이전에 써먹은 방법인데 왜 생각을 못하니...
- new Comprator<Job>(){... public int compare(ob1, ob2) { } }
- 피곤해서 50%의 뇌도 못썼지만, 그래도 이전에 다른 문제에서 스스로 풀어낸 소스들로 충분히 풀어낼 수 있었다. 구현이 막히지 않도록 이런 기법들을 다시 뇌에 박자.
- 알고리즘 도출까지는 성공했다.
- 출처