파이썬 알고리즘 인터뷰80번(리트코드 621번) Task Scheduler
https://leetcode.com/problems/task-scheduler/
class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
result = 0
cooling = collections.defaultdict(lambda: -n-1)
counts = collections.Counter(tasks)
remain = len(tasks)
while remain > 0:
idle = True
for task in counts.most_common():
if result - cooling[task[0]] <= n or counts[task[0]] == 0:
continue
else:
counts[task[0]] -= 1
cooling[task[0]] = result
result += 1
remain -= 1
idle = False
break
if idle:
result += 1
return result
idle을 하나 넣어준다.class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
counts = collections.Counter(tasks)
result = 0
while counts:
cycle = n + 1
while cycle:
for char, freq in counts.most_common():
counts[char] -= 1
cycle -= 1
result += 1
if counts[char] == 0:
del counts[char]
if cycle == 0:
break
if counts:
result += cycle
cycle = 0
return result
n=7이면 가장 많이 나온 문자가 A일 때 두 A 사이에 7개의 다른 문자를 넣어서 A를 포함하면 길이 8인 cycle이 반복된다.idle이 되는 상황이 생긴다. 풀이1에서는 모든 문자의 남은 횟수를 조회 후 idle 한 개를 추가한다. 3개의 idle을 추가하려면 3번씩 모든 문자를 조회하는 것이다.idle을 한 번에 추가하게 되어 좀 더 빠르다.class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
counts = collections.Counter(tasks)
max_freq = counts.most_common(1)[0][1]
max_char = [key for key, val in counts.items() if val == max_freq]
return max((n + 1) * (max_freq - 1) + len(max_char), len(tasks))
len(tasks) 보다 작은 값이 나오는 엣지 케이스가 있었는데, len(tasks)값이랑 구한 값을 max처리할 생각을 하지 않고 위의 나의 풀이 2로 접근했었다.class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
freq = collections.Counter(tasks).values()
max_freq = max(freq)
num_of_max_freq = list(freq).count(max_freq)
return max((n + 1) * (max_freq - 1) + num_of_max_freq, len(tasks))
class Solution:
def leastInterval(self, tasks: List[str], n: int) -> int:
counts = collections.Counter(tasks)
result = 0
while True:
sub_count = 0
for task, _ in counts.most_common(n + 1):
sub_count += 1
result += 1
counts.subtract(task)
counts += collections.Counter() # 0 이하인 아이템 제거
if not counts:
break
result += n - sub_count + 1
return result
counts.most_common(n)이 아니라 counts.most_common(n + 1) 하여 마지막 부분 처리한 아이디어.counts += collections.Counter() 이용하여 0 이하인 아이템 제거하는 아이디어.counts += collections.Counter() 이용하여 0 이하인 아이템 제거하는 아이디어 몰랐었음.