🧩 Algorithm/LeetCode

[LeetCode] 347 Top K Frequent Elements

nerowiki 2024. 6. 20. 17:21
728x90

💡 오늘의 학습 키워드

더보기

📌  문자열

 

문제 설명

문제 링크 : https://leetcode.com/problems/top-k-frequent-elements/
Given an integer array nums and an integer k, return the k most frequent elements.
You may return the answer in any order.
제한 사항
1. 1 <= nums.length <= 10^5
2. -10^4 <= nums[i] <= 10^4
3. k is in the range [1, the number of unique elements in the array].
4. It is guaranteed that the answer is unique.

 

문제 회고

💡 어떤 문제가 있었고, 나는 어떤 시도를 했는지 그리고 새롭게 안 사실은 무엇인지

가장 빈도가 높은 k개의 요소를 추출하는 문제였습니다. 딕셔너리에 각 요소의 개수를 저장하고 내림차순하여 값을 추출하면
값을 구할 수 있습니다. 요소 수를 구하는 문제라는 것을 이용하여 Counter 함수를 활용하는 방법도 찾을 수 있었습니다.
문제 풀이 과정은 다음과 같습니다.

  1. 빈도 계산을 통해 'nums' 배열에서 각 요소가 몇 번 등장하는지 계산해야 합니다.
  2. 이후 각 요소의 빈도를 기준으로 정렬합니다.
  3. 가장 빈도가 높은 상위 'k'개의 요소를 추출하여 반환합니다.

 

💡 내가 해결한 방식은?
딕셔너리 value 값 내림차순을 이용한 풀이
from typing import List
from collections import defaultdict

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        answer = defaultdict(int)
        result = set()

        for num in nums:
            answer[num] += 1
        
        answer = sorted(answer.items(), key=lambda x:x[1], reverse=True)

        cnt = 0
        for key, value in answer:
            if cnt == k:
                break
            cnt += 1
            result.add(key)

        return result
Counter의 most_common 메소드를 이용한 풀이
from collections import Counter

def topKFrequent(nums, k):
    count = Counter(nums)
    top_k_elements = [element for element, frequency in count.most_common(k)]
    return top_k_elements

✍️ TIL

처음 영문으로 되어있는 문제를 해석하는데 애를 좀 먹었다. K값보다 작은 수를 구하는건가 싶어 set으로 중복을 예방하고 로직을 구성해보았는데, 테스트 케이스를 모두 통과하지 못했다. 문제를 다시 이해하니 주어진 배열의 요소 수에 따라 내림차순하여 k개에 맞춰서
결과 값을 구하는 문제였다. 요소 수를 딕셔너리에 저장하고 내림차순만 할 수 있으면 반복문으로 값을 구할 수 있으니 이 점 유의하고
활용하는 데 익숙해져야지