[프로그래머스 알고리즘 고득점 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.14
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 큰 수 만들기  (1) 2026.08.10
[프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱  (0) 2026.08.02
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 주식가격  (0) 2026.07.29
[프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 다리를 지나는 트럭  (0) 2026.07.29
'알고리즘 & 자료구조/문제 풀이' 카테고리의 다른 글
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 구명보트
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 큰 수 만들기
  • [프로그래머스 알고리즘 고득점 Kit][그리디][Java] 조이스틱
  • [프로그래머스 알고리즘 고득점 Kit][스택/큐][Java] 주식가격
수수다
수수다
우하하
  • 수수다
    그냥살자
    수수다
  • 전체
    오늘
    어제
    • 분류 전체보기 (92)
      • 프로젝트 (2)
      • 알고리즘 & 자료구조 (49)
        • 내용 정리 (2)
        • 문제 풀이 (47)
      • 데이터베이스 (37)
        • 내용 정리 (1)
        • 문제 풀이 (36)
      • CS (2)
      • 기타 (2)
  • 블로그 메뉴

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

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

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바