알고리즘/프로그래머스

LEVEL 3 : 디스크컨트롤러

webmaster 2021. 11. 25. 20:10
728x90

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

 

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

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

programmers.co.kr

 

  • 문제
    • 문제 1
    • 문제 2
    • 문제 3
    • 문제 4

풀이

  • 시작 시준을 기준으로 배열을 정렬한다
  • 우선순위 큐를 선언한다
    • 실행시간이 짧은 순으로 꺼내지도록 우선순위 큐를 정의한다.
  • 반복문(모든 데이터를 처리했을 때까지 , count변수 == jobs.length까지...)
    • 시간 변수를 하나 선언 한 뒤 시간 변수 전에 시작되는 모든 값들의 우선순위 큐에 넣는다.
    • 만약 우선순위 큐가 비었을 경우
      • 만약 [[1,2], [2,4], [6,8]] 이러한 데이터를 가지고 진행한다고 했을 때, 4초부터 6초까지 2초간의 텀을 계산하기 위한 경우의 수이다.
    • 비어있지 않을 경우
      • 우선순위 큐에 담겨 있는 값을 꺼낸 뒤 대 현재시간에 + 프로세스 진행시간을 더해준 뒤 , 대기시간을 더해준다.
  • 글로 쓰려고 하니까 설명하기 힘들지만 코드를 보면 이해하기 쉽다.
  • class Disk{
    	int startTime; // 시작 시간
    	int processTime; // 프로세스 진행 시간
    	public Disk(int startTime,int processTime) {
    		this.processTime = processTime;
    		this.startTime = startTime;
    	}
    }
     public static int solution(int[][] jobs) {
        	int answer = 0;
        	Arrays.sort(jobs,(o1,o2)->{ // 시작 시간을 기준으로 정렬
        		if(o1[0] == o2[0])
        			return o1[1] - o2[1];
        		return o1[0] - o2[0];
        	});
        	Queue<Disk> pq = new PriorityQueue<>((o1,o2)->{ // 프로세스 진행이 짧은 순으로 정렬
        		return o1.processTime - o2.processTime;
        	});
        	int startIdx = 0; // 현재 시간에 진행가능한 배열 까지의 index
        	int count = 0;//총 갯수 => count가 배열을 끝까지 돌아야된다.
        	int now = 0;//현재 시간
        	while(count < jobs.length) {// 배열 마지막 요소까지 돌아라
        		while(startIdx < jobs.length && jobs[startIdx][0] <= now) { 
                	// 현재 시간에서의 진행가능한 배열을 요소까지 우선순위 큐에 넣어준다.
        			pq.offer(new Disk(jobs[startIdx][0], jobs[startIdx][1]));
        			startIdx++; 
        		}
        		if(pq.isEmpty()) {//만약 우선순위 큐가 비어 있다면, 배열에 현재시간보다 작은것이 없다면 현재 시간을 배열 요소로 초기화
        			now = jobs[startIdx][0];
        		}else {
        			Disk d = pq.poll();//우선순위 큐에 존재하는 실행시간이 가장 작은 디스크를 꺼낸뒤
        			now += d.processTime; // 현재시간에 실행 시간만큼 더해준다,
        			answer += now - d.startTime; // 총 대기시간에 현재시간 + 실행 시간 - 시작시간
        			count++;//하나 처리 완료
        		}	
        	}
        	return answer/jobs.length;
        }
728x90

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

LEVEL 3 : 정수 삼각형  (0) 2021.11.26
LEVEL 3 : 리틀 프렌즈 사천성  (0) 2021.11.25
LEVEL 3 : [1차] 추석 트래픽  (0) 2021.11.24
LEVEL 3 : 등굣길  (0) 2021.11.23
LEVEL 3 : N으로 표현  (0) 2021.11.23