유블로그

[프로그래머스] 디스크컨트롤러 본문

알고리즘

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

yujeong kang 2021. 1. 2. 18:31

프로그래머스 level3 디스크컨트롤러

 

이상한 코드

import java.util.PriorityQueue;

class Solution {
	static class Job implements Comparable<Job> {
		int request, totalTime;

		public Job(int request, int totalTime) {
			this.request = request;
			this.totalTime = totalTime;
		}

		@Override
		public int compareTo(Job o) {
			return this.totalTime-o.totalTime;
		}
	}
    static int N;
    static int[][] JOBS;
	public int solution(int[][] jobs) {
    	N = jobs.length;

    	PriorityQueue<Job> q = new PriorityQueue<>();
		for (int i = 0; i < N; i++) {
			q.offer(new Job(jobs[i][0], jobs[i][1]));
		}
		
		int total = 0;
		int second = 0;
		Job j;
		while(!q.isEmpty()) {
			j = q.poll();
			total += second + j.totalTime - j.request;
			second += j.totalTime;
		}
        return total/N;
    }
	
}

-> 이렇게 하면 작업을 하다가 중간에 막 다른 작업도 하게 되고

    비는시간도 생각 안 하고

    어쨌든 말도 안되는 코드...^^

 

priorityQueue에 다 넣고 while 안에서 어떻게 처리하는 지 알 수가 없어서

그래서 다른 코드 참고해서 풀었다...

 

해답은 pq에 애초부터 한 번에 다 안 넣는 것이었다!!!

second를 조절하여 작업이 시작될 수 있다면 pq에 넣는다!

 

pq 조건은 내가 처음에 설정한 적은 작업시간 기준이 맞았다.

그리고 total 계산도 맞는 거였다~~

 

너무 어려웠다..

 

정답 코드

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

class Solution {
	static class Job implements Comparable<Job> {
		int request, totalTime;

		public Job(int request, int totalTime) {
			this.request = request;
			this.totalTime = totalTime;
		}

		@Override
		public int compareTo(Job o) {
			return this.totalTime-o.totalTime;
		}
	}
	
	public int solution(int[][] jobs) {
    	int N = jobs.length;
    	PriorityQueue<Job> q = new PriorityQueue<>();
		Arrays.sort(jobs, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[0]-o2[0];
			}
		});
    	
		int total = 0,second = 0,idx = 0;
		Job j;
		while(true) {
			if(idx == N && q.isEmpty()) break;
			while(idx < N && jobs[idx][0] <= second) {
				q.offer(new Job(jobs[idx][0],jobs[idx][1]));
				idx++;
			}
			if(q.isEmpty()) {
				second = jobs[idx][0];
			}
			else {
				j = q.poll();
				total += second + j.totalTime - j.request;
				second += j.totalTime;
			}
		}
		
        return total / N;
    }
	
}

 

소요시간 1시간 35분

'알고리즘' 카테고리의 다른 글

[프로그래머스] 모의고사  (0) 2021.01.03
[프로그래머스] 이중우선순위큐  (0) 2021.01.03
[프로그래머스] K번째수  (0) 2020.12.26
[프로그래머스] 프린터  (0) 2020.12.23
[프로그래머스] 불량사용자  (0) 2020.12.22