-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtask_scheduler.py
More file actions
58 lines (46 loc) Β· 2.8 KB
/
task_scheduler.py
File metadata and controls
58 lines (46 loc) Β· 2.8 KB
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 621. Task Scheduler
# https://leetcode.com/problems/task-scheduler/
from typing import List
from collections import Counter, deque
class Solution:
# task λ€μ΄ μ£Όμ΄μ§κ³ μ¬μ΄μΌ ν μκ° n μ΄ μ£Όμ΄μ§ λ (κ°μ taskλ λ°λμ n λ§νΌμ ν΄μμκ°μ΄ νμνλ€)
# κ°μ₯ μ μ μ€ν μκ°μ 리ν΄νλ λ¬Έμ λ€. (task λ€μ ν¨μ¨μ μΌλ‘ μ°μ μμλ₯Ό μ ν΄μ μ€ννλΌλ μλ―Έ)
def leastInterval(self, tasks: List[str], n: int) -> int:
# κ°μ₯ λ§μ΄ λ±μ₯νλ task κ° λ¨Όμ μ€νλμ΄μΌ νλ greedy λ¬Έμ λΌκ³ λ³Ό μ μλ€.
# κ·Έλ¬λ μ¬μ€ task μ νμ
μ΄ λ¬΄μμΈμ§λ μ νμκ° μλ€.
# μλ₯Ό λ€λ©΄ A, A, A, A, A, A, B, C, D, E, F, G λΌλ task κ° μ€κ³ n μ΄ 2λΌκ³ νμ.
# μ€νμκ°μ λ¨μΆμν€λ €λ©΄ μλ¬΄λ° taskλ μ§νν μ μλ idle μκ°μ λ¨μΆμμΌμΌ νλ€.
# μ¦ A idle idle A B C 보λ€λ A B C A μμμ μ€ν μκ°μ΄ λ μ λ€λ μλ―Έλ€.
# κ²°κ΅μ κ°μ₯ λ§μ΄ λ±μ₯νλ task λ λ¨Όμ μ€νλμ΄μΌ νκ³ λμμ μ€κ°μ μ΅λν λ€λ₯Έ task κ° μ€νλκ²λ ν΄μΌ νλ€λ κ²μ΄λ€.
# κ·Έλ¬λ―λ‘ task μ μ’
λ₯ 보λ€λ κ°μ₯ λ§μ΄ λ±μ₯ν task λ€μ 빨리 μμ§ μν¨λ€κ³ μκ°νλ©΄ λλ€.
# νμ΄λ μλμ κ°λ€.
# κ° task κ° λ±μ₯νλ νμλ₯Ό μΉ΄μ΄ν
νκ³ μ΄λ₯Ό λ§μ΄ λ±μ₯νλ μμλλ‘ μ λ ¬νλ€.
counter = Counter(tasks)
heap = sorted(counter.items(), key=lambda x: -x[1])
# deque λ μ μͺ½μμ popμ ν μ μκ³ μνμλκ° O(1)μ΄λΌ λ°κΏ μ£Όμλ€.
heap = deque(heap)
execution_time = 0
# task κ° λ¨μ μλ λμ λ°λ³΅νλ€.
while any(counter.keys()):
i = 0
# μ¬μ΄μΌ ν μκ° n λ³΄λ€ νμ¬ task λ₯Ό μ±μ΄ μκ° i κ° μμμΌ νκ³
# μ§νν΄μΌ ν task κ° λ¨μ μμ λ κΉμ§ λ°λ³΅νλ€.
while i <= n and any(counter.values()):
if len(heap) > 0:
# κ°μ₯ λ§μ΄ λ±μ₯ν task λ₯Ό κΊΌλΈλ€.
t, c = heap.popleft()
# νμλ₯Ό μ°¨κ°μν¨λ€.
counter[t] -= 1
if counter[t] == 0:
del counter[t]
# μ€ν μκ°μ μΆκ°νλ€.
i += 1
execution_time += 1
# λ¨μ task λ€μ λ€μ μ λ ¬νλ€.
heap = sorted(counter.items(), key=lambda x: -x[1])
heap = deque(heap)
return execution_time
if __name__ == '__main__':
# λ§λΆμ΄μλ©΄, μ¬μ€ νμ΄μ¬μμ heapq λΌλ μλ£κ΅¬μ‘°κ° μκΈ΄ νλ€.
sol = Solution()
assert sol.leastInterval(["A","A","A","B","B","B"], 2) == 8