프로그래머스 디스크 컨트롤러 풀이 과정 우선순위 큐를 써야 한다는 건 알았는데, 요청 시각 기준 정렬과 현재 시간 관리를 놓쳤다. NullPointer에 너무 많이 걸려서 어느 지점에서 터지는지는 GPT 도움을 받았고, 나머지는 스스로 풀었다. 총 2번의 제출
1트 (오답) → 요청 시각 무시, 현재 시간 관리 없이 큐에 전부 넣고 순서대로 처리 2트 (정답) → 요청 시각 기준 정렬 후, 현재 시간에 들어온 작업만 큐에 투입
작업 시간이 짧은 것부터 처리하는 SJF(Shortest Job First) 스케줄링 문제라는 걸 파악하고, 소요 시간 기준 최소 힙으로 접근했다. 문제는 "현재 시각에 요청된 작업만 처리 가능하다" 는 조건을 처음엔 제대로 반영하지 못했다.
1트 (오답)
→ 전체 작업을 처음부터 큐에 다 넣어버렸다. → time을 첫 번째 작업의 요청 시각으로 초기화하고, 큐에서 꺼내는 순서대로 처리했다. → 요청 시각과 무관하게 소요 시간이 짧은 것부터 처리되는 구조가 됐다.
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
PriorityQueue<int[]> pq = new PriorityQueue<>((int[] a, int[] b) -> {
if(a[1] == b[1]) return a[0] - b[0];
else if(a[2] == b[2]) return a[1] - b[1];
else return a[2] - b[2];
});
int num = 0;
for(int[] job : jobs) {
pq.offer(new int[]{num++, job[0], job[1]});
}
int time = pq.peek()[1];
int answer = 0;
while(!pq.isEmpty()) {
int[] cur = pq.poll();
time += cur[2];
answer += time - cur[1];
}
return answer/num;
}
}
위 풀이의 결과
- 아직 요청되지도 않은 작업이 큐에 들어가 있으니, 현재 시각보다 늦게 들어오는 작업이 먼저 처리되는 경우가 생긴다.
- 예를 들어 요청 시각이 100인 작업이 소요 시간이 짧다고 time = 0일 때 먼저 처리되면 대기 시간 계산 자체가 어긋난다.
- NullPointer도 발생했는데, 큐 비교 로직에서 a[2]가 없는 경우를 처리 못 했기 때문이었다. 이 부분은 GPT에게 어느 지점에서 터지는지 확인했다.
2트 (정답)
→ 먼저 요청 시각 기준으로 jobs를 정렬했다. → 현재 시각 time 이하로 요청된 작업만 큐에 넣고, 그 중 소요 시간이 가장 짧은 것을 처리한다. → 큐가 비어있으면 아직 요청된 작업이 없다는 뜻이므로 time++로 시간을 흘려보낸다.
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
Arrays.sort(jobs, (a,b)->{
if(a[0] == b[0]) return a[1] - b[1];
else return a[0] - b[0];
});
PriorityQueue<int[]> pq = new PriorityQueue<>((int[] a, int[] b) -> {
if(a[1] == b[1]) return a[0] - b[0];
else if(a[2] == b[2]) return a[1] - b[1];
else return a[2] - b[2];
});
int num = 0;
int time = 0;
int answer = 0;
while(num < jobs.length || !pq.isEmpty()) {
// 현재 시각 이하로 요청된 작업을 큐에 투입
for(int i=num; i<jobs.length; i++) {
if(jobs[i][0] <= time) {
pq.offer(new int[] {i, jobs[i][0], jobs[i][1]});
num++;
}
}
if(!pq.isEmpty()) {
int[] cur = pq.poll();
time += cur[2];
answer += time - cur[1];
}
else time++; // 아직 요청된 작업 없음 → 시간만 흘림
}
return answer/num;
}
}
위 풀이의 결과
- 요청 시각 기준으로 정렬해두니 time 이하인 작업만 순서대로 큐에 넣을 수 있었다.
- else time++이 핵심이다. 큐가 비어있는 구간, 즉 다음 작업이 아직 요청되지 않은 구간을 건너뛰는 역할을 한다.
- 루프 조건을 num < jobs.length || !pq.isEmpty()로 잡은 덕분에, 모든 작업을 투입한 뒤 큐에 남은 것까지 처리하고 끝난다.
1트에서 요청 시각 조건을 완전히 무시하고 전부 큐에 넣어버린 게 근본적인 실수였다. 스케줄링 문제에서 "현재 시각에 요청된 작업만 처리 가능하다" 는 조건은 단순해 보여도 구현에서 가장 중요한 부분이다. NullPointer 위치는 GPT 도움을 받았지만, 구조 자체는 직접 고쳤다. 그래도 AI 없이 완전히 혼자 풀지 못했다는 게 아쉽다. 다음에 비슷한 구조의 문제가 나오면 정렬 → 현재 시각 기준 투입 → SJF 처리 흐름을 바로 떠올릴 수 있을 것 같다.
'CS > 코딩테스트' 카테고리의 다른 글
| 프로그래머스 - K번째 수 (JAVA) (0) | 2026.05.01 |
|---|---|
| 프로그래머스 - 가장 큰 수 (JAVA) (0) | 2026.05.01 |
| 프로그래머스 - 주식 가격 (JAVA) (0) | 2026.04.24 |
| 프로그래머스 - 다리를 지나는 트럭 (JAVA) (0) | 2026.04.24 |
| 프로그래머스 - 프로세스 (JAVA) (0) | 2026.04.24 |
