Python: Code Taka 2주차 4

dev-swd·2020년 11월 15일
0

Code Taka

목록 보기
9/12

Q. nums는 숫자로 이루어진 배열입니다. 가장 자주 등장한 숫자를 k 개수만큼 return해주세요.

nums = [1,1,1,2,2,3],
k = 2

return [1,2]

nums = [1]
k = 1

return [1]

나의 답

from collections import Counter
def top_k(nums, k):
  cnt = Counter(nums)
  top = cnt.most_common()
  result = []
  for n in range(k):
      result.append(top[n][0])
  
  return result
  1. collection 의 Counter 클래스를 사용
    class collections.Counter([iterable-or-mapping])
  2. Counter(nums) 를 사용하면 Counter 객체가 반환된다.
  3. Counter 클래스의 메서드 most_common() 를 사용하면 가장 많이 나온 값이 몇 번 나왔는지에 대한 튜플을 반환한다.
  • 만약 [1,1,1,2,2,3] 리스트를 Counter 에 인자로 주고 리턴 값을 받는다면,
    Counter({1: 3, 2: 2, 3: 1}) 리턴
  • most_common 메서드를 사용하면
    [(1, 3), (2, 2), (3, 1)] 리턴
  1. 가장 많이 등장한 값대로 정렬이 된 tuple 리스트를 k 만큼 반복하여, 원하는 수를 추출한다.
    답은 리스트 형태를 원하고 있으므로 result 라는 리스트에 값을 추가시켰다.

조금 더 간단하게 수정한 답

from collections import Counter

def top_k(nums, k):
  cnt = Counter(nums)
  top = cnt.most_common(k)
  return list(map(lambda x: x[0], top))

솔루션

def top_k(nums, k):
    count = {}
    for n in nums:
        count[n] = count.get(n, 0) + 1
        
    bucket = [[] for _ in range(len(nums)+1)]
    
    for n, freq in count.items():
        bucket[freq].append(n)
        
    ret = []
    for n_list in bucket[::-1]:
        if n_list:
            ret.extend(n_list)
            if len(ret) == k:
                return ret

(솔루션 분석 중..)

profile
개발을 취미로 할 수 있는 그 때 까지

0개의 댓글