[CodeKata] 9. top_k

chaduri7913·2022년 6월 17일
0

CodeKata

목록 보기
8/18

문제

nums는 숫자로 이루어진 배열이다..

가장 자주 등장한 숫자를 k 개수만큼 return 하라.

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

return [1,2]

nums = [1]
k = 1

return [1]


풀이

  1. 문제의 조건 정리
1) 숫자로 이루어진 배열과 자연수를 인자로 받는다.
2) 배열에 들어가 있는 중복되는 숫자의 갯수 중, 가장 많은 숫자를 기준으로 k번째까지의 숫자를 리스트 형태로 반환한다.

  1. 조건에 대한 코드 구현 방법 생각
1) dictionary를 선언해서 숫자를 key, 숫자의 갯수를 value로 받는다.
2) dictionary에서 value가 큰 순으로 key를 반환한다.

  1. 구현 코드
def top_k(nums, k):
  dict = {}
  lst = []
  
  for n in set(nums):
    dict[n] = 0

  for n in set(nums):
    dict[n] += nums.count(n)

  for i in range(k):
    max_key = max(dict, key=dict.get)
    lst.append(max_key)
    del(dict[max_key])
  
  return lst

  1. 코드 리뷰
1) for문을 2개 써서 dictionary를 만드는 방법 말고 다른 방법은 없을까?
2) 3번째 for문처럼 하지 않고 간결하게 k번째까지의 key값을 뽑을 수 있는 방법이 없을까?

  1. 최고의 코드
def top_k(nums, k):
  new_dict = { nums.count(i):i for i in set(nums) }

  value_list = sorted(new_dict.keys(), reverse=True)[:k]
  return [new_dict[i] for i in value_list]

1) new_dict = { nums.count(i):i for i in set(nums) }
dictionary comprehension을 통해서 바로 숫자와 횟수가 들어가 있는 dictionary를 선언
2) value_list = sorted(new_dict.keys(), reverse=True)[:k]
new_dict.keys() : 숫자의 횟수를 가져온다
sorted( reverse=True )[:k] : 내림차순으로 정렬 후 k번째 까지의 횟수를 가져온다.
3) [new_dict[i] for i in value_list]
value_list에서 순서대로(값이 큰 순서대로 정렬되어 있음) new_dict 인덱스 값으로 넣어서 숫자를 반환.

0개의 댓글