https://programmers.co.kr/learn/courses/30/lessons/42627?language=java
λ¬Έμ
νλλμ€ν¬λ ν λ²μ νλμ μμ λ§ μνν μ μμ΅λλ€. λμ€ν¬ 컨νΈλ‘€λ¬λ₯Ό ꡬννλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ λ°©λ²μ μμ²μ΄ λ€μ΄μ¨ μμλλ‘ μ²λ¦¬νλ κ²μ λλ€.
μλ₯Όλ€μ΄
- 0ms μμ μ 3msκ° μμλλ Aμμ μμ² - 1ms μμ μ 9msκ° μμλλ Bμμ μμ² - 2ms μμ μ 6msκ° μμλλ Cμμ μμ²
μ κ°μ μμ²μ΄ λ€μ΄μμ΅λλ€. μ΄λ₯Ό κ·Έλ¦ΌμΌλ‘ νννλ©΄ μλμ κ°μ΅λλ€.
ν λ²μ νλμ μμ²λ§μ μνν μ μκΈ° λλ¬Έμ κ°κ°μ μμ μ μμ²λ°μ μμλλ‘ μ²λ¦¬νλ©΄ λ€μκ³Ό κ°μ΄ μ²λ¦¬ λ©λλ€.
- A: 3ms μμ μ μμ μλ£ (μμ²μμ μ’ λ£κΉμ§ : 3ms) - B: 1msλΆν° λκΈ°νλ€κ°, 3ms μμ μ μμ μ μμν΄μ 12ms μμ μ μμ μλ£(μμ²μμ μ’ λ£κΉμ§ : 11ms) - C: 2msλΆν° λκΈ°νλ€κ°, 12ms μμ μ μμ μ μμν΄μ 18ms μμ μ μμ μλ£(μμ²μμ μ’ λ£κΉμ§ : 16ms)
μ΄ λ κ° μμ μ μμ²λΆν° μ’ λ£κΉμ§ κ±Έλ¦° μκ°μ νκ· μ 10ms(= (3 + 11 + 16) / 3)κ° λ©λλ€.
νμ§λ§ A → C → B μμλλ‘ μ²λ¦¬νλ©΄
- A: 3ms μμ μ μμ μλ£(μμ²μμ μ’ λ£κΉμ§ : 3ms) - C: 2msλΆν° λκΈ°νλ€κ°, 3ms μμ μ μμ μ μμν΄μ 9ms μμ μ μμ μλ£(μμ²μμ μ’ λ£κΉμ§ : 7ms) - B: 1msλΆν° λκΈ°νλ€κ°, 9ms μμ μ μμ μ μμν΄μ 18ms μμ μ μμ μλ£(μμ²μμ μ’ λ£κΉμ§ : 17ms)
μ΄λ κ² A → C → Bμ μμλ‘ μ²λ¦¬νλ©΄ κ° μμ μ μμ²λΆν° μ’ λ£κΉμ§ κ±Έλ¦° μκ°μ νκ· μ 9ms(= (3 + 7 + 17) / 3)κ° λ©λλ€.
κ° μμ μ λν΄ [μμ μ΄ μμ²λλ μμ , μμ μ μμμκ°]μ λ΄μ 2μ°¨μ λ°°μ΄ jobsκ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, μμ μ μμ²λΆν° μ’ λ£κΉμ§ κ±Έλ¦° μκ°μ νκ· μ κ°μ₯ μ€μ΄λ λ°©λ²μΌλ‘ μ²λ¦¬νλ©΄ νκ· μ΄ μΌλ§κ° λλμ§ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ. (λ¨, μμμ μ΄νμ μλ λ²λ¦½λλ€)
μ ν μ¬ν
- jobsμ κΈΈμ΄λ 1 μ΄μ 500 μ΄νμ λλ€.
- jobsμ κ° νμ νλμ μμ μ λν [μμ μ΄ μμ²λλ μμ , μμ μ μμμκ°] μ λλ€.
- κ° μμ μ λν΄ μμ μ΄ μμ²λλ μκ°μ 0 μ΄μ 1,000 μ΄νμ λλ€.
- κ° μμ μ λν΄ μμ μ μμμκ°μ 1 μ΄μ 1,000 μ΄νμ λλ€.
- νλλμ€ν¬κ° μμ μ μννκ³ μμ§ μμ λμλ λ¨Όμ μμ²μ΄ λ€μ΄μ¨ μμ λΆν° μ²λ¦¬ν©λλ€.
νμ΄
μ΄ λ¬Έμ λ μ€μΌμ₯΄λ§ μκ³ λ¦¬μ¦ μ€μ SJF ( Shortest Job First ) λ₯Ό ꡬννλ λ¬Έμ μ΄λ€.
SJF ( Shortest Job First )
- FCFS ( First Come First Served ) μκ³ λ¦¬μ¦μ ν΄κ²°νκΈ° μν΄ λμ¨ μκ³ λ¦¬μ¦
- waiting queue μμ CPU μꡬλμ΄ κ°μ₯ μ μ ( κ°μ₯ 짧μ ) νλ‘μΈμ€μκ² CPU ν λΉ
- starvation λ°μ κ°λ₯ β‘οΈ aging κΈ°λ²μΌλ‘ ν΄κ²°
- μ€ν μ μλ μ€ν μκ°μ μ μ μμ΄μ, μ§μ νκ· λ°©λ²μ ν΅ν΄ μΆμΈ‘
watingJob μ μμ² μκ°μ λν΄ μ€λ¦μ°¨μμΌλ‘ μμ λ€μ λ£λλ€.
λκΈ° μμ λ€ μ€μ 첫 λ²μ§Έ μμ μ μμ² μκ°μ΄ νμ¬ μκ°λ³΄λ€ μμΌλ©΄ μμ μκ°μ λν΄ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λ PriorityQueueμ λ£μ΄μ€λ€.
pqμμ μμ μκ°μ΄ 짧μ μμ λ€μ κΊΌλ΄μ μμ νκ³ , timeμ μμ μκ°μ λν΄μ£Όκ³ , answerλ Turn Around Timeμ λν΄μ€λ€.
μ½λ
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
public class λμ€ν¬μ»¨νΈλ‘€λ¬ {
static class job{
int inTime;
int jobTime;
job(int inTime, int jobTime){
this.inTime = inTime;
this.jobTime = jobTime;
}
}
public static int solution(int[][] jobs) {
int answer = 0;
LinkedList<job> waitingJob = new LinkedList<>();
PriorityQueue<job> pq = new PriorityQueue<>(new Comparator<job>(){
@Override
public int compare(job o1, job o2) {
// TODO Auto-generated method stub
return o1.jobTime - o2.jobTime;
}
});
for(int[] j : jobs){
waitingJob.add(new job(j[0], j[1]));
}
Collections.sort(waitingJob, new Comparator<job>(){
@Override
public int compare(job o1, job o2) {
// TODO Auto-generated method stub
return o1.inTime - o2.inTime;
}
});
int idx = 0;
int time = waitingJob.peek().inTime;
while(idx < jobs.length){
while(!waitingJob.isEmpty() && waitingJob.peek().inTime <= time){
pq.offer(waitingJob.pollFirst());
}
if(!pq.isEmpty()){
job j = pq.poll();
time += j.jobTime;
answer += time - j.inTime;
idx++;
}else{
time++;
}
}
return answer/idx;
}
public static void main(String[] args) {
int[][] jobs = {{0,3} , {1,9}, {2,6}};
System.out.println(solution(jobs));
}
}
'μκ³ λ¦¬μ¦ > νλ‘κ·Έλλ¨Έμ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3 ] λ€λ¨κ³ μΉ«μ ν맀 (0) | 2021.09.20 |
---|---|
[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3 ] μμ (0) | 2021.09.16 |
[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3 ] λ€νΈμν¬ (0) | 2021.09.15 |
[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3] μ μ μΌκ°ν (0) | 2021.09.15 |
[ νλ‘κ·Έλλ¨Έμ€ / Programmers Level 3 ] 리ν νλ μ¦ μ¬μ²μ± (0) | 2021.09.15 |