🤔 나의 풀이
📌 문제
- 파이썬 알고리즘 인터뷰 31번 문제
📌 날짜
2020.02.02
📌 시도 횟수
3 try
💡 Code
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
arr = defaultdict(int)
ans = []
for num in nums:
arr[num] += 1
result = sorted(arr.items(), key=lambda x: x[1], reverse=True)
for x in result:
ans.append(x[0])
return ans[:k]
💡 문제 해결 방법
- (key = 숫자값, value = 각 숫자가 등장한 횟수)인 dict를 생성한다.
- value를 기준으로 dict를 내림차순으로 정렬한다.
- 정렬한 dict의 숫자값(key)만을 따로 순서대로 list로 추출하여 저장한다.
- 리스트 슬라이싱을 사용하여 list[:k]를 반환한다.
💡 새롭게 알게 된 점
✔ dict를 정렬하는 방법
1. key를 이용한 정렬
- sorted(dict.items())
+ items()는 튜플(key, value)로 구성된 리스트를 리턴한다.
2. value를 이용한 정렬
- sorted(dict.items(), key=lambda x: x[1])
+ 추가로.. reverse = True를 삽입하면 내림차순(큰것부터)으로 정렬된다.
❌ (한번에 맞추지 못한 경우) 오답의 원인
-
😉 다른 풀이
📌 하나. Counter + heapq 사용하기
class Solution:
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
freqs = Counter(nums)
freqs_heap = []
for f in freqs:
heapq.heappush(freqs_heap, (-freqs[f], f))
topk = list()
for _ in range(k):
topk.append(heapq.heappop(freqs_heap)[1])
return topk
💡 새롭게 알게 된 점
✔ Counter에 대해 알게 되었다. dict랑 거의 비슷하다.
>>> Counter([1, 3, 3, 2, 2, 2, 4])
Counter({2: 3, 3: 2, 1: 1, 4: 1})
>>> freqs = Counter([1, 3, 3, 2, 2, 2, 4])
>>> for key in freqs:
>>> print(key)
1
3
2
4
>>> freqs = Counter([1, 3, 3, 2, 2, 2, 4])
>>> for key, value in freqs.items():
>>> print(key, value)
1 1
3 2
2 3
4 1
>>> freqs[0]
0
>>> freqs[1]
1
참고 : Counter
- Counter objects support three methods beyond those available for all dictionaries
elements()
>> c = Counter(a=4, b=2, c=0, d=-2)
>> list(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common([n])
>> Counter('abracadabra').most_common(3)
[('a', 5), ('r', 2), ('b', 2)]
subtract([iterable-or-mapping])
>> c = Counter(a=4, b=2, c=0, d=-2)
>> d = Counter(a=1, b=2, c=3, d=4)
>> c.subtract(d)
>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})