21.3.11

알고리즘 8일차

문제 : 빈도수가 높은 k개의 요소만 리스트로 추출

  1. 접근 방법 :
  • 리스트로 for loop, count 등 사용 -> 단순한 방식이라 실패
  • 딕셔너리 형태로 접근 : 직접 딕셔너리 만들었지만 그 이상 나가지 못해 실패
  1. 새로운 접근 방법 : 모듈 사용
    from collections import Counter 및 속성
그 외 사용 개념 :
  • 딕셔너리 키값 추출
  • set
  • for loop / append
  • 리스트 개수 제한 및 슬라이싱
  1. 코드
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))
  1. 새롭게 안 내용이라 지속적으로 보면서 눈에 익어야 할 것 같음.

참고 링크

더 쉽게 푼 풀이(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))

좋은 웹페이지 즐겨찾기