-
[Algo RhythmπΊπ] νλ‘κ·Έλλ¨Έμ€ κ³ λμ kit λμ€ν¬ 컨νΈλ‘€λ¬Algo RhythmπΊπ/Programmers 2020. 7. 16. 02:30
π λ¬Έμ μ€λͺ
νλλμ€ν¬λ ν λ²μ νλμ μμ λ§ μνν μ μμ΅λλ€. λμ€ν¬ 컨νΈλ‘€λ¬λ₯Ό ꡬννλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ λ°©λ²μ μμ²μ΄ λ€μ΄μ¨ μμλλ‘ μ²λ¦¬νλ κ²μ λλ€.
μλ₯Όλ€μ΄
- 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 μ΄νμ λλ€.
-
νλλμ€ν¬κ° μμ μ μννκ³ μμ§ μμ λμλ λ¨Όμ μμ²μ΄ λ€μ΄μ¨ μμ λΆν° μ²λ¦¬ν©λλ€.
π― μ΄λ»κ² νμλ
첫λ²μ§Έ μλ (40μ / 100μ )
import java.util.Comparator; import java.util.PriorityQueue; class Job { public int tReq; public int period; public Job(int tReq, int period){ this.tReq = tReq; this.period = period; } public int getTReq(){ return this.tReq; } public int getPeriod() { return this.period; } } class Solution { public int solution(int[][] jobs) { int avg = 0, sum = 0; int nJob = jobs.length; int jIdx = 0; int t = 0; int tRemaining = 0; // remaining time of current working job to be done PriorityQueue<Job> tReqQ = new PriorityQueue<>(Comparator.comparing(Job::getTReq)); PriorityQueue<Job> periodQ = new PriorityQueue<>(Comparator.comparing(Job::getPeriod)); // Phase 1 : init tReqQ for(int i = 0;i < nJob; i++) { int tReq = jobs[i][0]; int period = jobs[i][1]; tReqQ.offer(new Job(tReq, period)); } while(!tReqQ.isEmpty() || !periodQ.isEmpty()) { if(!tReqQ.isEmpty() && t == tReqQ.peek().tReq) { Job j = tReqQ.poll(); periodQ.offer(new Job(j.tReq, j.period)); } if(!periodQ.isEmpty() && tRemaining == 0) { Job j = periodQ.poll(); tRemaining += j.period; sum += (j.period + t - j.tReq); // (tReq ~ tEnd) = period + (tStart - tReq) = period + tDelay } if(tRemaining > 0) { tRemaining--; } t++; } avg = sum / nJob; return avg; } }
λλ²μ§Έ μλ
import java.util.Arrays; import java.util.Comparator; import java.util.PriorityQueue; class Job { public int tReq; public int period; public Job(int tReq, int period){ this.tReq = tReq; this.period = period; } public int getPeriod() { return this.period; } } class Solution { public int solution(int[][] jobs) { int avg = 0, sum = 0; int nJob = jobs.length; int jIdx = 0; int t = 0; int tRemaining = 0; // remaining time of current working job to be done PriorityQueue<Job> periodQ = new PriorityQueue<>(Comparator.comparing(Job::getPeriod)); // Phase 1 : sort jobs by tReq Arrays.sort(jobs, (j1, j2) -> Integer.compare(j1[0], j2[0])); // Phase 2 while(jIdx < nJob || !periodQ.isEmpty()) { while(jIdx < nJob && t >= jobs[jIdx][0]){ // κ°λ₯ν jobλ€ νμ λ£κΈ° int tReq = jobs[jIdx][0]; int period = jobs[jIdx][1]; periodQ.offer(new Job(tReq, period)); jIdx++; } if(!periodQ.isEmpty()) { //νκ° λΉμ΄ μμ§ μμΌλ©΄ μΌν μ μλ μν Job j = periodQ.poll(); sum += j.period + (t - j.tReq); // (tReq ~ tEnd) = period + (tStart - tReq) = period + tDelay t += j.period; } else { // νκ° λΉμ΄ μμΌλ©΄ μΌν μ μλ μν t = jobs[jIdx][0]; } } avg = sum / nJob; return avg; } }
π§ μ μ λ κ² νμλ
첫λ²μ§Έ μλ (40μ / 100μ )
μκ³ λ¦¬μ¦μ ν΅μ¬μ νμ νλ κ²μ μ΄λ ΅μ§ μμλ€. μλνλ©΄ OSμκ°μ SJF(Short Job First) μ€μΌμ€λ§ μκ³ λ¦¬μ¦μ λ°°μ κΈ° λλ¬Έμ΄λ€. κ·Έλμ μκ°μ μ¦κ°νλ©΄μ μ€ν κ°λ₯ν μμ λ€μ λͺ¨λ μμμκ°μ κΈ°μ€μΌλ‘ ν μ΅μ νμ λ£κ³ μ€νν μ μλ μνκ° λ λλ§λ€ μ€ννλ©° μμ²λΆν° μ’ λ£κΉμ§ μμλ μκ°μ νκ· μ ꡬνκΈ°λ‘ νλ€.
λ¨Όμ μμ μ μμ² μμ κ³Ό μμμκ°μ λ©€λ² λ³μλ‘ κ°μ§λ Jobμ΄λΌλ ν΄λμ€λ₯Ό λ§λ€μλ€.
κ·Έλ¦¬κ³ Jobμ μμ² μμ μ κΈ°μ€μΌλ‘ ν μ΅μ νμΈ tReqQμ Jobμ μμ μκ°μ κΈ°μ€μΌλ‘ ν μ΅μ νμΈ periodQλ₯Ό λ§λ€μλ€.
tReqQλ 맀κ°λ³μλ‘ μ£Όμ΄μ§λ 2μ°¨μ λ°°μ΄ jobsκ° μμ² μμ μ λ°λΌ μ€λ¦ μ°¨μμΌλ‘ μ λ ¬λμ΄ μλ€λ 보μ₯μ΄ μκΈ° λλ¬Έμ λ§λ€μκ³ periodQλ κ°λ₯ν Jobλ€μ λͺ¨μΌκ³ κ·Έ μ€ μμ μκ°μ΄ κ°μ₯ 짧μ Jobμ λΉ λ₯΄κ² μ°ΎκΈ° μν΄ λ§λ€μλ€.
κ·Έ λ€μλΆν°λ κ°λ¨νλ€. λ νμ΄ λͺ¨λ λΉμ΄μ§ λκΉμ§ λ€μμ λ°λ³΅νλ€.
tReqQμμ κΊΌλΈ Jobμ μμ²μκ°μ΄ νμ¬ μκ°κ³Ό κ°μΌλ©΄ periodQμ κ·Έ jobμ λ£λλ€.
μΌμ ν μ μλ μν(= μ΄λ€ μΌμ΄ λλκΈ°κΉμ§ 걸리λ μκ°μ΄ 0μΌλ) periodQμμ job νλλ₯Ό κΊΌλΈλ€.
μκ°μ 1μ© μ¦κ°νλ€.
μ΄λ‘ μ λμνκΈ΄ λμνλ μ½λμ§λ§ μκ° μ΄κ³Όμ λ± κ±Έλ €λ²λ Έλ€...
λ ν¨μ¨μ μΌλ‘ μ½λλ₯Ό μμ ν νμκ° μμλ€.
λλ²μ§Έ μλ
λλ²μ§Έ μλλ λ€λ₯Έ λΆμ μ½λλ₯Ό μ°Έκ³ ν΄μ ν΄κ²°νλ€.
ν΅μ¬μ 첫λ²μ§Έμ λ€λ₯΄μ§ μλ€. νμ§λ§ μκ°μ μ¦κ°νλ λ°©μμ μμ΄μ 첫λ²μ§Έ μλλ μ€κ°μ λΆ λ¬ μκ°μ λͺ¨λ λ°λ³΅ν΄μΌ νμ§λ§ λλ²μ§Έ μλλ μ€κ°μ λΆ λ¬ μκ°μ 무μνλ€λ μ μμ λ€λ₯΄λ€.
π 무μμ λ°°μ λ
OS λ λ°°μ΄ SJF(Short Job First) μκ³ λ¦¬μ¦μ ꡬνν΄μ μ¬λ°κ³ λ°κ°μ λ€.
κ·Έλ¦¬κ³ λλ 'λ ν¨μ¨μ μΌλ‘ ν μλ μμκΉ? μ΄κ² μ΅μ μΌκΉ?' λΌκ³ λ μ§λ¬Ένλ μμΈκ° νμνλ€λ κ²μ λ°°μ λ€.
'Algo RhythmπΊπ > Programmers' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
-