카테고리 없음
[99클럽 코테 스터디 39일차 TIL] 1338. Reduce Array Size to The Half
explorer999
2024. 6. 27. 22:11
Reduce Array Size to The Half - LeetCode
<내 풀이>
from collections import Counter
class Solution:
def minSetSize(self, arr: List[int]) -> int:
res = 0
counter = Counter(arr)
counter = counter.most_common()
for i in range(len(counter)):
res += counter[i][1]
if res >= (len(arr)//2):
break
return i+1
힙 문제라고 적혀 있었지만 그냥 딕셔너리 이용해서 빈도 순 정렬 해서 푸는 것도 시간복잡도상 큰 차이를 보이지 않는다.
힙으로 하면 더 복잡해질 것도 같다.
<Counter 함수>
num_list = [1, 2, 3, 4, 4, 4]
My_num_dict = Counter(num_list)
라고 하면
결과: Counter({4: 3, 1: 1, 2: 1, 3: 1})
My_num_dict = dict(Counter(num_list))
라고 하면
결과: {4: 3, 1: 1, 2: 1, 3: 1}
이렇게 깔끔한 딕셔너리만 나오게 된다.
딕셔너리를 등장 횟수 순, 즉 키/값 중 값(value) 순으로 정렬하고 싶을 때,
두 가지 방법을 쓸 수 있다.
1. sorted 안에서 lambda 함수로 정렬의 기준을 정해주기
람다 함수 사용 방법을 자꾸 까먹는데 value 값이 아니라 key 값을 기준으로 정렬해야 할 때도 있어서 꼭 익숙해져야 한다.
sorted_list = sorted(counter.items(), key=lambda x: -x[1])
sorted_list = sorted(counter.items(), reverse = True, key = lambda x: x[1])
내림차순으로 정렬하고 싶은 거니까,
원래 오름차순으로 정렬되는 sorted() 함수에 reverse=True 옵션을 먹이거나,
람다 함수에서 매개변수에 - 붙인 값을 주면 된다. 그러면 절댓값이 높은 음수가 앞으로 가게 되니까 결국 내림차순 정렬 하는 것과 같은 효과를 준다고 한다.
나는 그냥 reverse = True 쓰는 게 더 편한 것 같다.
2. 파이썬에 내장되어 있는 Counter.most_common() 기능을 사용하기
counter 딕셔너리가 자동으로 빈도가 많은 것부터 적은 것 순으로 정렬된다.
counter = counter.most_common()
이런 식으로 쓰면 자동 정렬됨.