본문 바로가기
알고리즘

[프로그래머스] 디스크 컨트롤러 (java)

by 창따오 2024. 1. 8.
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제를 해결하기 위하여 필요한 것들 사고해보기

  • 어떻게 하면 요청부터 종료까지 걸리는 시간의 평균이 가장 적을까??
    1. 요청 시간을 기준으로 정렬한다.
    2. 작업이 수행되는데 소요되는 시간이 적게 걸리는 시간순으로 수행한다면 ->요청부터 작업완료까지의 소요시간이 가장 적을 것이다.

그럼 위에서 한 사고를 바탕으로 예외를 생각하며 구현해보자

import java.util.Arrays;
import java.util.PriorityQueue;

public class 디스크_컨트롤러 {
    public int solution(int[][] jobs) {
        //최종적인 목표는 요청부터 종료까지 걸린시간의 평균이 가장 작게
        int answer = 0;
        //일단 도착시간을 기준으로 오름차순 정렬하기
        Arrays.sort(jobs, (jobA, jobB)->jobA[0]-jobB[0]);
        //작업시간이 짧은 순으로, 정렬하기
        PriorityQueue<int []> pq = new PriorityQueue<>((o1, o2)->o1[1]-o2[1]);

        int jobCnt = 0;
        int jobIdx = 0;
        int end = 0; //이전 작업의 종료시간
        while(jobCnt<jobs.length){
            while(jobIdx<jobs.length && jobs[jobIdx][0]<=end){
                pq.offer(jobs[jobIdx++]);
            }
            if(pq.isEmpty()){// end를 다음 task의 요청시간으로
                end = jobs[jobIdx][0];
            }else{
                int [] task = pq.poll();
                int requestTime = task[0];
                int taskTime = task[1];
                answer+=taskTime+end-requstTime;
                end+=taskTime;
                jobCnt++;
            }
        }


        return answer/jobs.length;
    }
}

 

첫째, 일단 문제 해결을 위한 궁극적인 사고가 우선 돼야한다.

둘째, 사고한 것을 바탕으로 예외상황들을 고려하며 코드를 작성해야 한다.

솔직히 사고가 되는 것이 가장 중요하지만, 구현하는 것도 충분히 연습하지 않는다면 힘들다. 꾸준하게 연습하자.