(Python, Java) 리트코드 - Task Scheduler

[문제 링크]

Python 풀이

from typing import List

from collections import Counter


class Solution:
    def leastInterval(self, tasks: List[str], n: int) -> int:
        scheduler = sorted(Counter(tasks).items(), key=lambda x: x[1])
        max_frequency = scheduler.pop()[1]

        # 가장 개수가 많은 문자만 일렬로 나열했을 때 중간에 비어있는 유휴 시간
        idle_time = (max_frequency - 1) * n

        # 유휴 시간 채워주기
        while scheduler:
            idle_time -= min(scheduler.pop()[1], max_frequency - 1)

        # 유휴 시간이 음수가 되면 유휴 시간 없이 그냥 나열해도 수행가능해진다.
        idle_time = max(idle_time, 0)
        return len(tasks) + idle_time

Java 풀이

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Solution {
    public int leastInterval(char[] tasks, int n) {
        Map<Character, Integer> counter = new HashMap<>();

        for (char letter : tasks) {
            Integer cnt = counter.getOrDefault(letter, 0);
            counter.put(letter, cnt + 1);
        }

        List<Integer> count = counter.entrySet().parallelStream()
                .map(Map.Entry::getValue)
                .sorted()
                .collect(Collectors.toList());

        int size = counter.size();
        Integer maxCount = count.get(size - 1);
        int idleTime = (maxCount - 1) * n;

        for (int idx = size - 2; idx >= 0; idx--) {
            idleTime -= Math.min(count.get(idx),maxCount-1);
        }

        idleTime = Math.max(idleTime, 0);

        return tasks.length + idleTime;
    }
}

© 2021. By Backtony