
O( n log n )O(n)class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count = {}
for num in nums:
count[num] = 1 + count.get(num, 0)
arr = []
for num, cnt in count.items():
arr.append([cnt, num])
arr.sort() #빈도(cnt)를 기준으로 리스트를 오름차순으로 정렬
res = []
while len(res) < k:
res.append(arr.pop()[1])
return res
count.get(num, 0): 딕셔너리의 get() 메서드를 사용하여, 숫자 num이 딕셔너리에 있으면 그 값(빈도)을 가져오고, 없으면 기본값 0을 사용합니다. 즉, 숫자가 처음 등장하면 0에서 1로, 그 이후에는 기존 빈도에 1을 더해가며 빈도를 기록합니다.count.items(): count 딕셔너리의 키(숫자)와 값(빈도)을 (키, 값) 형태로 반환합니다.items()는 딕셔너리 메서드로, 딕셔너리의 키와 값을 쌍으로(튜플형태로) 반환하는 함수입니다.class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count = {}
for num in nums:
count[num] = 1 + count.get(num, 0)
heap = []
for num in keys():
heapq.heappush(heap, (count[num], num))
if len(heap) > k:
heapq.heappop(heap)
res = []
for i in range(k):
res.append(heapq.heappop(heap)[1])
return res
get() 함수의 의미 : get() 함수는 딕셔너리에서 키에 해당하는 값을 가져오는 함수입니다. 하지만 이 함수는 두 번째 인자를 통해 키가 딕셔너리에 없을 때 반환할 기본값을 지정할 수 있습니다.
[dictionary 이름].get(key, default_value)
keys()는 파이썬 딕셔너리 메서드로, 딕셔너리의 모든 키(key)들을 반환하는 함수입니다. 이 함수는 딕셔너리의 키들만을 추출하여 dict_keys 객체로 반환합니다. 이 dict_keys 객체는 반복 가능한(iterable) 객체이기 때문에, for 루프나 다른 반복문에서 사용할 수 있습니다.
if len(heap) > k : 힙의 크기가 k를 초과할 때
힙에 요소를 계속 삽입하다 보면, 힙의 크기가 k를 초과할 수 있습니다. 즉, 상위 k개의 요소를 유지하려면, 크기가 k를 넘는 순간에는 가장 작은 요소(빈도 기준)를 제거해야 합니다.
heapq.heappop()은 최소 힙에서 가장 작은 값(즉, 빈도가 가장 작은 요소)을 제거합니다.
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
count = {}
freq = [[] for i in range(len(nums) + 1)]
for num in nums:
count[num] = 1 + count.get(num, 0)
for num, cnt in count.items():
freq[cnt].append(num)
res = []
for i in range(len(freq) - 1, 0, -1):
for num in freq[i]:
res.append(num)
if len(res) == k:
return res
for i in range(len(freq) - 1, 0, -1)range(start, stop, step) : class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
frequency_map = {}
for num in nums:
if num in frequency_map:
frequency_map[num] +=1
else:
frequency_map[num] = 1
sorted_items=sorted(frequency_map.items(),
key=lambda item:item[1], reverse=True)
top_k_frequent = [item[0] for item in sorted_items[:k]]
return top_k_frequent
if in 구문은 어떤 요소가 리스트나 문자열 같은 시퀀스 자료형에 포함되어 있는지를 확인하는 데 사용됩니다. 즉, 특정 값이 시퀀스 안에 있는지 여부를 확인하는 조건문입니다. #리스트에서 값이 있는지 확인
my_list = [1, 2, 3, 4, 5]
if 3 in my_list:
print("3은 리스트에 있습니다.")
else:
print("3은 리스트에 없습니다.")
# 결과 : 3은 리스트에 있습니다.
sorted(iterable, key=None, reverse=False)sorted_items=sorted(frequency_map.items(),key=lambda item:item[1], reverse=True)lambda 인자들: 표현식: 파이썬의 collections.Counter는 리스트에서 각 요소의 빈도를 쉽게 계산할 수 있습니다. 또한 most_common(k) 메서드를 사용하면 빈도가 높은 상위 k개의 요소를 바로 추출할 수 있습니다.
from collections import Counter
def topKFrequent(nums, k):
# 1. nums의 요소 빈도 계산
count = Counter(nums)
# 2. 빈도가 높은 k개의 요소 반환
return [item for item, freq in count.most_common(k)]
: 파이썬의 heapq 모듈을 사용하여 상위 k개의 요소를 추출하는 방법입니다. 최소 힙(min heap)을 사용해 빈도가 높은 요소들을 관리할 수 있습니다.
import heapq
from collections import Counter
def topKFrequent(nums, k):
# 1. nums의 요소 빈도 계산
count = Counter(nums)
# 2. 우선순위 큐를 사용해 상위 k개의 요소 추출
return heapq.nlargest(k, count.keys(), key=count.get)
: 이 방법은 빈도별로 버킷을 만들어, 빈도가 같은 요소들을 그룹화하고, 빈도가 높은 순서대로 상위 k개의 요소를 반환하는 방식입니다
from collections import defaultdict
def topKFrequent(nums, k):
# 1. nums의 요소 빈도 계산
count = defaultdict(int)
for num in nums:
count[num] += 1
# 2. 버킷을 사용해 빈도에 따른 요소들을 그룹화
bucket = [[] for _ in range(len(nums) + 1)]
for num, freq in count.items():
bucket[freq].append(num)
# 3. 빈도가 높은 요소부터 추출
result = []
for i in range(len(bucket) - 1, 0, -1):
for num in bucket[i]:
result.append(num)
if len(result) == k:
return result
: 간단한 방법으로, 직관적이지만 성능이 다소 떨어질 수 있습니다.
from collections import Counter
def topKFrequent(nums, k):
count = Counter(nums)
sorted_items = sorted(count.items(), key=lambda x: x[1], reverse=True)
return [x[0] for x in sorted_items[:k]]