상위 K 빈도 요소 (leetcode)

고먐미·2024년 1월 5일
0

문제

Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order.

Example 1
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2
Input: nums = [1], k = 1
Output: [1]


풀어보기

풀기전에...

  • Counter()란?

  • collections 모듈의 클래스로 중복된 데이터가 저장된 배열을 인자로 넘기면 각 원소가 몇 번씩 나오는지 저장된 객체를 출력한다.
    (이 때, 결과값은 내림차순으로 나오지만 빈도 수가 같다면 index 값이 낮은 값 부터 나오는 듯 하다.)

  • 예시
    arr = [1, 2, 3, 3, 3, 2, 3, 1, 1, 2] 일때 Counter(arr)을 하면 Counter({3: 4, 1: 3, 2: 3}) 의 키:밸류 값을 가진 dictionary 형태의 결과값을 출력한다.

  • most_common()이란?

  • Counter() 클래스의 메서드로 Counter()의 결과값을 튜플 요소를 가진 리스트의 형태로 바꿔서 출력해준다.

  • 예시
    arr = [1, 2, 3, 3, 3, 2, 3, 1, 1, 2] 일 때, Counter(arr).most_common()의 결과값은 [(3, 4), (1, 3), (2, 3)]이다.

풀이

배열 nums 가 주어지고, 구하고자 하는 최빈값의 갯수인 k 가 주어진다.
이 때, nums 배열에서 가장 많이 등장하는 숫자를 k개만큼 구해주면 된다.

일단 우리는 파이썬의 Counter()를 사용해 nums에서 가장 많이 등장하는 수를 알아 볼 수 있다.

Counter()로 dict 형태의 결과값을 얻었다면 다시 most_common() 메소드를 통해 이 결과값을 튜플 형태의 요소를 가진 리스트로 출력해준다.

우리는 어떤 녀석이 몇번 나왔는지가 아닌 어떤 녀석이 최빈값인지 궁금하기 때문에 리스트 안의 튜플 첫 번째 값이 필요하다.
또, k 만큼의 최빈값을 구해야하므로 while문을 이용해 코드는 아래와 같이 작성이 가능하다.

코드

    def topKFrequent(self, nums: list[int], k: int) -> list[int]:
        result = []
        c = Counter(nums)
        mc = c.most_common()
        i = 0

        while i < k:
            result.append(mc[i][0])
            i = i + 1

        return result

문제 출처

leetcode 347번 상위 k 빈도 요소 문제

profile
개념을 이해하고 다른사람에게도 알려줄 수 있는 개발자가 되고 싶어요..

0개의 댓글