[Leet Code] 692. Top K Frequent Words(Assignment)

Yunju·2024년 10월 6일

692. Top K Frequent Words

문제

My Answer


일단 스터디에서 푼 문제를 참고해서 풀긴 풀었다!!

class Solution:
    def topKFrequent(self, words: List[str], k: int) -> List[str]:
        count = {}
        for word in words:
            count[word] = 1+count.get(word,0) 
            #word키가 count{}에 존재할때 : count[word] = 1+ count의 str키를 가진 value 반환
            #word키가 count{}에 존재하지 않을때 : count[word] = 1+0

        heap = []
        for str in count.keys():
            heapq.heappush(heap, (-count[str],str))
        res = []
        for i in range(k):
            res.append(heapq.heappop(heap)[1])
        
        return res

그냥 내 식대로? 편하게 풀이를 해보자면
1. count라는 이름의 딕셔너리를 만듦. 여기에 (단어 : 빈도수)를 가진 딕셔너리를 만들거임.
2. 주어진 words리스트를 for문 돌려서 키 값인 단어에 value값(빈도수)을 1+count.get(word,0)으로 지정함.

  • 이때 get()에서 너무 헷갈렸는데, dict.get(key, default_value) 이게 기본 문법이고, 그냥 key값의 value를 반환하는것임. 만약에 key가 dictionary에 없다면 default value를 반환하는것임.
  1. heap에 heapq.heappush(우선순위큐)로 넣음. 그런데,문제에서
    "Return the answer sorted by the frequency from highest to lowest. Sort the words with the same frequency by their lexicographical order." 라고 했음.
    lexicographical order은 heapq에서 알아서 처리해주니 신경안써도 되는데, sorted by the frequency from highest to lowest는 내가 직접 처리해줘야됨.
    --> heap에 넣을때 빈도수를 뜻하는 count[str]에 음수를 붙여줘서 가상으로나마 내림차순으로 만듦.
    • 왜? 만약 음수를 안붙인다면, heap은 우선순위에 따라서 1,2,3이렇게 출력될 것(작은것~큰것)이다.
      예 : {1: starbucks, 2: timhortons, 3: breka, 4: blenz} ... 출력도 starbucks~~blenz순으로 될 것이다.
      그런데, -를 붙여서 넣게 되면,
      예 : {-4: blenz, -3: breka, -2: timhortons, -1: starbucks} ...
      이렇게 되면 출력도 가장 절대값이 큰 blenz가 먼저 출력될것이다.
  2. heappop은 가장 작은 최소값부터 꺼내기때문에, res에는 가장 최소값인(-를 붙였으니 우리한테는 절대값이 큰 빈도수)의 heap[1]==word를 꺼내어 res에 담길것이다. 하지만, range(k)만큼만 돌릴것이다.
    ( range(k)= 숫자 k를 반복 가능한 범위로 변환하는 것)
  3. res 값을 반환하면 끝!!

0개의 댓글