21.3.11
알고리즘 8일차
문제 : 빈도수가 높은 k개의 요소만 리스트로 추출
- 접근 방법 :
- 리스트로 for loop, count 등 사용 -> 단순한 방식이라 실패
- 딕셔너리 형태로 접근 : 직접 딕셔너리 만들었지만 그 이상 나가지 못해 실패
- 새로운 접근 방법 : 모듈 사용
from collections import Counter 및 속성
그 외 사용 개념 :
- 딕셔너리 키값 추출
- set
- for loop / append
- 리스트 개수 제한 및 슬라이싱
- 코드
from collections import Counter
# collections의 Counter : 리스트를 딕셔너리로 만드는데 요소 개수의 '순서대로' 출력해 줌 : "따로 리버스 할 필요가 없었다."
def top_k(nums, k):
count = Counter(nums)
# 먼저 Counter로 nums를 개수의 순서대로 딕셔너리화 시킨다.
sub_list = []
# 딕셔너리의 키를 받을 서브 리스트를 만든다.(내가 필요한건 키지 값이 아님)
for K, V in count.most_common(k):
# for loop 로 값을 가져오는 과정.
# 여기서 쓰인 count.most_common(k) : 가장 최빈값 k번째까지 가져온다.
for j in range(V):
# 키값을 가져오려면 values도 같이 loop 해야 하므로 같이 돌려주고
sub_list.append(K)
# sublist에 필요한 K를 넣어준다. (여기서 k개까지만 이미 리스트화 된다.)
one_list = list(set(sub_list))
# 여러 값이 나온(value 갯수 순으로 222333..)나온 것을 세트+리스트로 다시 정리
result = []
for i in one_list[:k]:
result.append(i)
return result
# 이후 다시 k번째 값까지 구함. 이 때 리스트의 슬라이싱 이용
print(top_k([1,1,2,2,2,2,3,3,3], 2))
- 새롭게 안 내용이라 지속적으로 보면서 눈에 익어야 할 것 같음.
참고 링크
더 쉽게 푼 풀이(21.5.3)
def top_k(nums, k):
nums.sort()
# 배열 정렬
to_dict = {i : nums.count(i) for i in nums}
# 개수 별로 리스트 -> 딕셔너리화(list comprehension)
new_dict = sorted(to_dict, key = lambda j : to_dict[j], reverse=True)
# 자주 등장, 즉 value값이 큰 순서대로 Key값을 정렬하기 위해 reverse를 사용
result = new_dict[:k]
# k까지 출력
return result
print(top_k([1,1,1,2,2,3], 2))
Author And Source
이 문제에 관하여(21.3.11), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sinichy7/21.3.11알고리즘저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)