공부기록

디스크 컨트롤러 본문

코테/프로그래머스

디스크 컨트롤러

코타쿠 2021. 5. 20. 21:53
  • 문제

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

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr

  • 코드
더보기
import java.util.*;

class Solution {
    class Job{
        public int s_t;
        public int r_t;
        public Job(int s_t, int r_t){
            this.s_t = s_t;
            this.r_t = r_t;
        }
    }
    
    public int solution(int[][] jobs) {
        int answer = 0;
        ArrayList<Job> jobArr = new ArrayList<>();
        PriorityQueue<Job> pq = new PriorityQueue<>(new Comparator<Job>(){
            @Override
            public int compare(Job ob1, Job ob2){
                return ob1.r_t - ob2.r_t;
            }
        });
        
        for(int i=0; i<jobs.length; i++){
            jobArr.add(new Job(jobs[i][0], jobs[i][1]));
        }
        
        Collections.sort(jobArr, new Comparator<Job>(){
            @Override
            public int compare(Job ob1, Job ob2){
                return ob1.s_t - ob2.s_t;
            }
        });
        
        int cur_time = jobArr.get(0).s_t;
        int cursor = 0;
        int cnt = 0;
        
        while(cnt < jobs.length){
            while(cursor < jobArr.size() && jobArr.get(cursor).s_t <= cur_time){
                pq.add(jobArr.get(cursor++));
            }
            
            if(!pq.isEmpty()){
                Job cur_job = pq.poll();
                cur_time += cur_job.r_t;
                answer += (cur_time-cur_job.s_t);
                cnt++;
            }else{
                cur_time++;
            }
        }
        
        
        
        return answer/jobs.length;
    }
}
  • 피드백
    • 알고리즘 도출까지는 성공했다.
      • work들을 들어온 순으로 sort하고
      • 시간 별로 pq에 넣으면서 최소 length를 가지는 work를 빼내면서 결과를 낸다.
    • 문제는 구현을 못함... (컨디션 탓인 것 같다. 문제 풀때 굉장히 피곤했음)
    • 금방 생각 못한 구현은 다음과 같다.
      • new Comprator<Job>(){... public int compare(ob1, ob2) { } }
        • 익명 클래스를 구현하여 compare custom을 할 수 있음. 자바 문법을 제대로 몰랐음... 기억하자. 
        • Collection.sort(list, new Comparator<>()) 
        • PriorityQueue<Job>(new Comparator<>()))
        • compare(ob1, ob2) 일 때, ob1.val - ob2.val 이 오름차순이라는 것을 기억하자.
      • 루프 exit 조건
        • 현재 시간을 세면서 현재 시간 이전의 아직 평가하지 못한 Job들을 pq에 넣어야했다.
        • 이것을 위해 loop을 걸고 cur_time을 증가시키면서 넣기만 하면 되는데 문제는 loop 탈출 조건을 생각을 제대로 못함
        • 그냥 모든 Job이 튀어 나왔으면 끝내면 된다.
          • 그것은 cnt를 써서 지금까지 튀어나온 Job을 생각해주면 되었다.
          • 이전에 써먹은 방법인데 왜 생각을 못하니...
    • 피곤해서 50%의 뇌도 못썼지만, 그래도 이전에 다른 문제에서 스스로 풀어낸 소스들로 충분히 풀어낼 수 있었다. 구현이 막히지 않도록 이런 기법들을 다시 뇌에 박자.
  • 출처

https://velog.io/@hyeon930/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-Java

 

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

프로그래머스 디스크 컨트롤러이 문제는 스케쥴링 알고리즘 중 하나인 SJF 알고리즘을 구현하는 문제였다.SPN(Shortest Process Next) / SJF(Shortest Job First)준비 큐에서 가장 짧은(CPU 요구량이 가장 적은)

velog.io

 

'코테 > 프로그래머스' 카테고리의 다른 글

가장 큰 수  (0) 2021.08.21
퍼즐 조각 채우기 (위클리 챌린지 3주차)  (0) 2021.08.17
후보키  (0) 2021.05.05
임시  (0) 2021.05.05
경주로 건설  (0) 2021.05.04