[CodeKata]Day9

박민하·2022년 6월 16일
0

python 문제

목록 보기
24/49
post-thumbnail

Code Kata 란, 2인 1조의 구성으로 서로 협력하여 하루에 한 문제씩 해결하는 과제입니다.


# 문제

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

가장 자주 등장한 숫자를 k 개수만큼 return 해주세요.

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

# 코드

def top_k(nums, k):
    # 여기에 코드를 입력해주세요
    num = {}
    result = []
    for i in nums:
        try: num[i] +=1 # 딕셔너리에 해당 key가 있으면(오류가 없으면) 갯수 +1
        except: num[i] =1 # 없으면 갯수가 1이라고 저장
    for i in range(k):
        for key, value in num.items():
            if value == sorted(num.values(), reverse=True)[i]:
                result.append(key)
    return result

# 풀이 과정

  1. 빈 dict를 만들고, try except문을 통해 nums의 중복 데이터 값이 몇개가 있는지 나타내는 num 변수 생성.
  2. 개수를 알 수 있는 value 값을 sort로 정렬, reverse=True로 내림차순 정렬.
  3. 매개변수 k값을 for문의 반복 횟수로 지정.
    • for문 안에는 num이라는 dict의 value 값 중, sort한 value값과 동일한 값을 빈 리스트 result에 append
    • 이를 k만큼 반복한다.
  4. result 리스트를 return

+ 그 외 코드

1번

def top_k(nums, k):
    # 여기에 코드를 입력해주세요
  num_set = set(nums)
  num_set = list(num_set)

  num_count = []

  for i in num_set:
    num_count.append(nums.count(i))
  
  num_count.sort()

  count = []
  if k == 1:
    res = []
    a = num_count.pop()
    for i in nums:
      if nums.count(i) == a:
        res.append(i)
        return res
        
  
  
  else:
    res = []
    num_count.reverse
    for i in num_count[:k]:
      for ii in nums:
        if i == nums.count(ii):
          res.append(i)

    res = set(res)
    res = list(res)

    return res

2번

def top_k(nums, k): 
  new_dict = {}
  result = []
  
  for num in nums:
    if num in new_dict :
      new_dict[num] += 1
    else: 
      new_dict[num] = 1

  value_list = sorted(new_dict.values(), reverse=True)[:k]

  for i in new_dict :
    if new_dict[i] in value_list :
      result.append(i)

3번 - 2번 코드 간소화

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]
profile
backend developer 🐌

0개의 댓글