Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 10830번
- 9장
- 백준
- 11758번
- 코딩 테스트
- Spring
- 코딩테스트
- 2206번
- 자바의 정석
- java
- SerialDate 리펙터링
- 1300번
- 프로그래머스
- programmers
- 17장
- Design Patterns
- 가장 긴 증가하는 부분 수열2
- springboot
- java의 정석
- 냄새와 휴리스틱
- BOJ
- 1043번
- 2166번
- Dxerr.h
- 클린코드
- Adapater Pattern
- DxTrace
- Design Pattern
- 11286번
- 2156번
Archives
- Today
- Total
Don't give up!
[프로그래머스] 디스크 컨트롤러(java) 본문
코딩테스트 연습 - 디스크 컨트롤러 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
주어진 작업들 중 소요시간이 짧은 작업을 먼저 수행하는 그리디 알고리즘으로 문제를 해결할 수 있을 것이라고 생각하였습니다.
작업의 수행은 LIFO의 자료구조인 Queue를 사용하고자 하였고, 작업 수행시간에 따른 정렬을 수행할 수 있는 PriorityQueue를 이용하는 것이 좋다는 생각을 하였습니다.
코드
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
int answer=0, index=0, time=0, count=0;
Arrays.sort(jobs,(a,b) -> a[0]-b[0]);
PriorityQueue<int[]> process = new PriorityQueue<>(512,(x,y) ->x[1]-y[1]);
time = jobs[0][0];
while(count<jobs.length){
while(index<jobs.length&&time>=jobs[index][0]){
process.offer(jobs[index++]);
}
if(!process.isEmpty()){
int[] current = process.poll();
time+=current[1];
answer+=time-current[0];
count++;
}else{
time = jobs[index][0];
}
}
return answer/jobs.length;
}
}
테스트를 통과하는 코드를 작성하였습니다.
PriorityQueue는 생성자에 Comparator를 매개변수로 받아 원소의 순서 비교를 할 수 있습니다.
모든 작업들을 요청시간에 따라 정렬한 후, 받을 수 있는 작업들을 모두 큐에 삽입, 소요시간 순서에 따라 작업을 수행함으로서 요청 - 완료까지 걸리는 평균 시간의 최소 값을 얻을 수 있습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 합승 택시 요금(java) (0) | 2021.05.27 |
---|---|
[프로그래머스] 다단계 칫솔 판매(java) (0) | 2021.05.23 |
[프로그래머스] 네트워크 (java) (0) | 2021.05.22 |