[TIL] Code Kata 8

def top_k(nums, k):
  nums_number = list(set(nums))
  final_list = []
  count_dict = {}

  for i in nums_number:
    count_dict[i] = nums.count(i)

  dict_tuple = count_dict.items()
  sorted_dict_tuple = sorted(dict_tuple, reverse=True, key=lambda x:x[1])

  for i in range(k):
      final_list.append(sorted_dict_tuple[i][0])

  return final_list

이 문제를 해석해보면 가장 많이 반복되는 숫자 순으로 k개가 리스트에 담겨져서 반환되어야 한다. 처음에는 리스트를 이용해서 구현하려고 했지만 잘 되지 않았다. 그래서 생각해 낸것이 딕셔너리이다. 일단, list(set(nums))으로 중복된 숫자를 제거하고 리스트에 담는다. 그리고 그 리스트에 담겨져 있는 숫자의 개수만큼 for문을 돌려서 딕셔너리 형태로 ex) {'1':개수, '2':개수} 만든다.
count_dict.items()를 사용하면 {('1':개수), ('2':개수)} 이런식으로 만들어지는데 그렇게 되면 딕셔너리도 리스트처럼 index를 사용할 수 있게 된다. 그렇게 만들어진 딕셔너리를 sorted 메소드를 사용해서 value 값이 큰 순으로 정렬 시킨다. sorted(dict_tuple, reverse=True, key=lambda x:x[1]) -> x:x[1] 의 의미가 value 값을 의미한다. x:x[0]으로 사용하면 key값을 의미하게 된다.

그렇게 정렬된 딕셔너리를 for문으로 k번 돌려서 key값을 차례로 뽑으면 된다.
이렇게 하기 위해서 value 값이 큰 순으로 정렬 시켰다.

좋은 웹페이지 즐겨찾기