99클럽 코테 스터디 23일차 TIL [LeetCode] Top K Frequent Elements (Java)

민경·2024년 6월 20일

문제

[LeetCode] Top K Frequent Elements

풀이

주어진 정수 배열 중 가장 빈도가 높은 수부터 k번째로 높은 수까지 구하는 문제

  • 주어진 배열 nums를 순회하며 빈도를 해시맵에 저장한다.
  • 해시맵의 키셋을 frequencies 리스트에 넣고, value가 높은 순으로 정렬한다.
  • answerk번째 수까지 담아 결과를 반환한다.

정답 코드

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> hm = new HashMap<>();
        for (int num : nums) {
            hm.put(num, hm.getOrDefault(num, 0) + 1);
        }
        List<Integer> frequencies = new ArrayList<>(hm.keySet());
        frequencies.sort((a, b) -> hm.get(b) - hm.get(a));
        
        int[] answer = new int[k];
        for(int i = 0; i < k; i++) {
            answer[i] = frequencies.get(i);
        }

        return answer;
    }
}

다른 풀이

PriorityQueue(우선순위 큐)를 활용한 풀이

  • Map.Entry<Integer, Integer> 형식의 우선순위 큐를 사용하여 빈도가 낮은 항목이 먼저 제거되도록 한다.
  • k개 이상의 항목이 우선순위 큐에 들어가면, 가장 낮은 빈도의 항목을 제거한다.
class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> hm = new HashMap<>();
        for (int num : nums) {
            hm.put(num, hm.getOrDefault(num, 0) + 1);
        }
        PriorityQueue<Map.Entry<Integer, Integer>> minHeap = 
            new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());

        for (Map.Entry<Integer, Integer> entry : hm.entrySet()) {
            minHeap.offer(entry);
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }

        int[] result = new int[k];
        for (int i = k - 1; i >= 0; i--) {
            result[i] = minHeap.poll().getKey();
        }

        return result;
    }
}
profile
강해져야지

0개의 댓글