[프로그래머스 알고리즘 고득점 Kit][힙(Heap)][Java] 디스크 컨트롤러

2026. 8. 5. 18:25·알고리즘 & 자료구조/문제 풀이

 

https://school.programmers.co.kr/learn/courses/30/lessons/42627

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

작업을 요청 시각 기준으로 정렬한 뒤, 현재 시각까지 요청된 작업만 우선순위 큐에 넣는다.

우선순위 큐에서는 다음 순서로 작업을 선택한다.

소요 시간 → 요청 시각 → 작업 번호
 

전체 흐름은 다음과 같다.

작업을 요청 시각순으로 정렬
→ 대기 큐가 비었다면 다음 요청 시각까지 이동
→ 현재 시각까지 요청된 작업을 모두 대기 큐에 추가
→ 우선순위가 높은 작업 실행
→ 종료 시각 - 요청 시각을 반환 시간에 누적
→ 모든 작업의 평균 반환 시간 계산
 

waitingIndex를 사용해 아직 대기 큐에 넣지 않은 작업의 위치를 관리한다.

시간 복잡도

  • 작업 정렬: O(N log N)
  • 우선순위 큐 삽입·삭제: O(N log N)
  • 전체 시간 복잡도: O(N log N)
  • 공간 복잡도: O(N)

 

import java.util.*;

class Solution {
    
    class Job {
        int number;
        int requestTime;
        int duration;
        
        Job(int number, int requestTime, int duration) {
            this.number = number;
            this.requestTime = requestTime;
            this.duration = duration;
        }
    }
    
    public int solution(int[][] jobs) {
        List<Job> jobList = new ArrayList<>();
        int jobCount = jobs.length;
        for(int i=0; i<jobCount; i++) {
            jobList.add(new Job(i, jobs[i][0], jobs[i][1]));
        }
        Collections.sort(jobList, (j1, j2) -> {
            return Integer.compare(j1.requestTime, j2.requestTime);
        });
        
        PriorityQueue<Job> pq = new PriorityQueue<>((j1, j2) -> {
            if(j1.duration == j2.duration) {
                if(j1.requestTime == j2.requestTime) {
                    return Integer.compare(j1.number, j2.number);
                }
                return Integer.compare(j1.requestTime, j2.requestTime);
            }
            return Integer.compare(j1.duration, j2.duration);
        });
        
        int waitingIndex = 0;
        int currTime = 0;
        int totalReturnTime = 0;
        int completedJobCount = 0;
        
        
        while(completedJobCount < jobCount) {

            //대기큐에 들어있는 작업이 없다. -> 더 이상 요청한 작업이 없다. -> 현재시각이 다음 작업의 요청시간보다 앞선 상태 그래서 다음 작업의 요청 시각으로 현재 시각을 옮겨 줘야함.
            if(pq.isEmpty()) {
                currTime = Math.max(currTime, jobList.get(waitingIndex).requestTime);
            }
            //이전 작업의 끝 시각(현재시각)보다 이전에 시작하는 작업들을 대기큐에 넣어줌.(문제 설명 4번, 들어오는 오는 시점이 겹친다면 ... 대기 큐에 저장한 뒤... )
            for(int i=waitingIndex; i<jobCount; i++) {
                Job job = jobList.get(i);
                if(currTime >= job.requestTime) {
                    pq.add(job);
                    waitingIndex++;
                } else {
                    break;
                }
            }

            
            Job currJob = pq.poll();
            if(currTime < currJob.requestTime) {
                currTime = currJob.requestTime;
            }
            currTime += currJob.duration;
            totalReturnTime += currTime - currJob.requestTime;
            completedJobCount++;
        }
        
        return totalReturnTime / jobCount;
    }
}

처음엔 대충 이해하고 
우선순위큐에 다 때려넣고 시작해서 뭐가 틀린지 한참을 찾았다.
문제를 자세하게 읽자

저작자표시 비영리 변경금지 (새창열림)

'알고리즘 & 자료구조 > 문제 풀이' 카테고리의 다른 글

[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱  (0) 2026.08.02
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 주식가격  (0) 2026.07.29
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 다리를 지나는 트럭  (0) 2026.07.29
[프로그래머스 알고리즘 고득점 Kit][완전탐색][Java] 모음사전  (0) 2026.07.27
[프로그래머스 알고리즘 고득점 Kit][완전탐색][Java] 전력망을 둘로 나누기  (0) 2026.07.25
'알고리즘 & 자료구조/문제 풀이' 카테고리의 다른 글
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱
  • [프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 주식가격
  • [프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 다리를 지나는 트럭
  • [프로그래머스 알고리즘 고득점 Kit][완전탐색][Java] 모음사전
수수다
수수다
우하하
  • 수수다
    그냥살자
    수수다
  • 전체
    오늘
    어제
    • 분류 전체보기 (85) N
      • 프로젝트 (1)
      • 알고리즘 & 자료구조 (46) N
        • 내용 정리 (2)
        • 문제 풀이 (44) N
      • 데이터베이스 (34)
        • 내용 정리 (1)
        • 문제 풀이 (33)
      • CS (2)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 네이버 블로그
  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    완전탐색
    AVG
    해시
    깊이/너비 우선 탐색(DFS/BFS)
    백트래킹
    SQL
    coalesce
    알고리즘
    코테
    프로그래머스 알고리즘 고득점 kit
    코딩테스트
    유니온파인드
    date_format
    그래프
    SUBSTR
    mysql
    IFNULL
    동적계획법
    dfs
    Java
    bfs
    like
    분리집합
    DP
    Stack
    Round
    프로그래머스
    코딭테스트
    정렬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
수수다
[프로그래머스 알고리즘 고득점 Kit][힙(Heap)][Java] 디스크 컨트롤러
상단으로

티스토리툴바