[Algorithm] λμ€ν¬ 컨νΈλ‘€λ¬
π λ¬Έμ
νλλμ€ν¬λ ν λ²μ νλμ μμ λ§ μνν μ μμ΅λλ€. λμ€ν¬ 컨νΈλ‘€λ¬λ₯Ό ꡬννλ λ°©λ²μ μ¬λ¬ κ°μ§κ° μμ΅λλ€. κ°μ₯ μΌλ°μ μΈ λ°©λ²μ μμ²μ΄ λ€μ΄μ¨ μμλλ‘ μ²λ¦¬νλ κ²μ λλ€.
μλ₯Όλ€μ΄
- 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 μ΄νμ λλ€.
- νλλμ€ν¬κ° μμ μ μννκ³ μμ§ μμ λμλ λ¨Όμ μμ²μ΄ λ€μ΄μ¨ μμ λΆν° μ²λ¦¬ν©λλ€.
μ μΆλ ₯ μ
[[0, 3], [1, 9], [2, 6]] | 9 |
βοΈ νμ΄
μ΄ λ¬Έμ μμ κ°μ₯ μ€μ μ μμ μ μμ²μκ°λΆν° μμ μ΄ λλλ μκ°μ΄ μ΅μκ° λλ κ²μ΄λΌκ³ μκ°νλ€. μ²μμλ κ·Έλνν μμΌμ μ λ ¬ν μ΄ν μμμλΆν° λΉΌμ£Όλ λ°©λ²μ μ¬μ©ν΄λ³ΌκΉ νλλ° μκ° νλ¦κ³Ό μ΄λ€ μμ μ νμ λ μ΅μκ° λλμ§ νλ³νκΈ°κ° μ΄λ €μ λ€. κ·Έλμ jobs λ°°μ΄μ λ¨Όμ μ λ ¬μν€κ³ μκ°μ μ¦κ°μν€λ©΄μ νμ¬ ν μ μλ μμ μ΄ μμ λ κ°μ₯ μ΅μμ μμμκ°μ κ°μ§κ³ μλ(κ°μ₯ μ΅μ μκ°) μμ μ λΉΌμ€μΌκ² λ€κ³ μκ°νλ€.
κ³μν΄μ μ λ ¬μ μννκ² λλ©΄ μ΅μ μ κ²½μ° 1000!μ μκ°μ΄ νμνκΈ° λλ¬Έμ μκ°μ΄κ³Όκ° μΌμ΄λ κ²μ΄λΌκ³ μκ°νκΈ° λλ¬Έμ min heapμ μ¬μ©νλ€ min heapμ μμ μ λ΄μ©(jobs λ°°μ΄μ μμ)λ₯Ό λ°μ λ λ²μ§Έ μμ(μμμκ°)μ κΈ°μ€μΌλ‘ μ μΌ μ μμκ° μμ κ°μ΄ λλλ‘ νλ€.
whileλ¬Έμ λλ©΄μ μκ°μ μ¦κ°μν€λλ° λ¨μ μμ μ΄ μμ λ(jobs.length || heap.size())κΉμ§ λ°λ³΅νλ€. whileλ¬Έ νλλ₯Ό λ μ€μ²©μμΌμ νμ¬ μκ°μ ν μ μλ μμ μ΄ μμλ heapμ λ£μ΄μ€λ€. μ΄ν ifλ¬ΈμΌλ‘ νμ¬ μνν μ μλ μμ μ΄ μμ λ(heap.size()) heapμμ λΉΌμ μ΄ μμμκ°μ λν΄μ€¬λ€.
κ°μ₯ μΈλΆμ whileλ¬Έμ΄ μ’ λ£λκ³ (λͺ¨λ μμ μ μν) answerμ μ΄ μμμκ°μ μ΄ μμ κ°μλ‘ λλ μ£Όκ³ μμμ μ΄νλ₯Ό λ²λ¦ΌμΌλ‘μ¨ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμλ€.
β¨οΈ μ½λ
class MinHeap {
constructor() {
this.heap = [];
this.heap.push(-1e9);
}
insert(value) {
this.heap.push(value);
this.upheap(this.heap.length - 1);
}
upheap(pos) {
let temp = this.heap[pos];
while (temp[1] < this.heap[parseInt(pos / 2)][1]) {
this.heap[pos] = this.heap[parseInt(pos / 2)];
pos = parseInt(pos / 2);
}
this.heap[pos] = temp;
}
get() {
if (this.size() === 0) return 0;
if (this.size() === 1) return this.heap.pop();
const result = this.heap[1];
this.heap[1] = this.heap.pop();
this.downheap(1, this.heap.length - 1);
return result;
}
downheap(pos, len) {
let temp = this.heap[pos],
child;
while (pos <= parseInt(len / 2)) {
child = pos * 2;
if (child < len && this.heap[child][1] > this.heap[child + 1][1]) child++;
if (temp[1] <= this.heap[child][1]) break;
this.heap[pos] = this.heap[child];
pos = child;
}
this.heap[pos] = temp;
}
size() {
return this.heap.length - 1;
}
}
function solution(jobs) {
var answer = 0;
const n = jobs.length;
const heap = new MinHeap();
jobs.sort((a, b) => b[0] - a[0]);
let totalTime = 0;
let s = 0;
while (jobs.length || heap.size()) {
while (jobs.length && jobs[jobs.length - 1][0] <= s) {
const job = jobs.pop();
heap.insert(job);
}
if (heap.size()) {
const [start, time] = heap.get();
totalTime += s + time - start;
s += time;
} else {
s += 1;
}
}
answer = Math.floor(totalTime / n);
return answer;
}