코테/프로그래머스

[프로그래머스/Lv. 3] 디스크 컨트롤러 (JAVA)

imname1am 2023. 7. 31. 20:42
반응형

🔺 문제

 

프로그래머스

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

programmers.co.kr

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.*;
import java.io.*;
 
class Solution {
    public int solution(int[][] jobs) {
        int total = 0;
        int end = 0;    // 수행되고 난 직후 시간
        int idx = 0;    // jobs 배열의 인덱스
        int cnt = 0;    // 수행된 요청 갯수
 
        // 🔔 1. 작업 끝나는 시점이 들어온 요청에 대해 가장 짧은 수행시간 가진 작업 선택
        Arrays.sort(jobs, (o1,o2) -> o1[0- o2[0]);
        
        // 🔔 2. 수행시간이 짧은 작업부터 처리 (우선순위 큐ㅡ Heap)
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1- o2[1]);
        
        // 요청이 모두 수행될 때까지 반복
        while(cnt < jobs.length) {
            
            // 한 작업이 완료되는 시점(end)까지 들어온 모든 요청을 큐에 넣음
            while(idx < jobs.length && jobs[idx][0<= end) {
                pq.add(jobs[idx++]);
            }
            
            // 큐가 비어있다면, 작업 완료(end) 이후 다시 요청이 들어옴
            if(pq.isEmpty()) {
                end = jobs[idx][0];
            }
            // 작업이 끝나기 전, 들어온 요청 중 가장 수행시간이 짧은 요청부터 수행
            else {
                int[] tmp = pq.poll();
                
               total += tmp[1+ end - tmp[0];
                end += tmp[1];
                cnt++;
            }
        }
        
        return total / jobs.length;
    }
}
cs
✅ 해결 아이디어
✔ 힙 (Heap)
- 대기 시간을 최소로 줄여 요청되는 작업 수행하면 됨.
1) '작업 요청 시점'  짧은 순으로  오름차순 정렬
2)  '작업 소요 시간' 짧은 순으로 오름차순 정렬 (⭐ 우선순위 큐, Heap ⭐)

 

💥 유의사항

• 18번째 줄 | while(jobs.length --> 0) 했다가 런타임 에러 뜸..

 

 


🔺 다른 풀이들

- 새로 class 생성해서 정렬하셨다.

 

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

코딩테스트 연습 - 디스크 컨트롤러 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온

bellog.tistory.com

 

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

이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다. 틀리거나 잘못된 정보가 있을 수 있습니다. 댓글로 알려주시면 수정하도록 하겠습니다. 1. 문제 하드디스크는 한 번에 하나의 작업만 수

small-stap.tistory.com

 

 

- 로직은 같은데 주석이랑 이런 게 다 깔꼼해서 줍줍...

 

프로그래머스

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

programmers.co.kr

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

class Solution {
    public int solution(int[][] jobs) {
        int answer = 0;

        // 작업이 요청되는 시점 기준으로 오름차순 정렬
        Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);

        // 작업의 소요시간 기준으로 오름차순 정렬
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);

        int jobs_index = 0; // 작업 배열 인덱스
        int finish_job = 0; // 처리 완료된 작업 개수
        int end_time = 0; // 작업 처리 완료 시간

        while(true) {
            if(finish_job == jobs.length) break; // 모든 작업을 처리했다면 종료

            // 이전 작업 처리 중 요청된 작업 add
            while(jobs_index < jobs.length && jobs[jobs_index][0] <= end_time) {
                pq.add(jobs[jobs_index++]);
            }

            if(!pq.isEmpty()) { // 이전 작업 처리 중 요청된 작업이 있는 경우
                int[] job = pq.poll();
                answer += end_time - job[0] + job[1]; // 작업 요청부터 종료까지 걸린 시간 추가
                end_time += job[1]; // 작업 처리 완료 시간 갱신
                finish_job++; // 처리 완료된 작업 개수 1 증가
            } else { // 이전 작업 처리 중 요청된 작업이 없는 경우
                end_time = jobs[jobs_index][0]; // 다음 작업 요청 시점으로 갱신
            }
        }

        return answer / jobs.length;
    }
}

💬 느낀 점

 작업 수행 시간( 2차원 배열의 2번쨰 값)이 짧은 순으로 정렬하고

누적합 사용해서 푸면 되는 거 아닌가 했는데 틀렸었다..ㅠ

 

풀고 나니 어려운 문제가 아닌데 참....ㅠ

복습을 허자!!!

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

- 풀이

 

프로그래머스_힙(Heap)_디스크 컨트롤러 (JAVA)

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

codevang.tistory.com

 

 

- 2차원 배열 정렬 (둘째 값 기준 정렬)

 

[Java] 2차원 배열 정렬 (오름차순, 내림차순, 다중 조건)

> 2차원 배열을 오름차순, 내림차순, 이외에 원하는 조건 등 여러가지 방법으로 정렬 하는 방법을 포스팅 합니다. 2차원 배열을 바로 Arrray.sort()를 통해 정렬하려고 하면 java.lang.ClassCastException: I ca

ifuwanna.tistory.com

 

반응형