파이썬(python) 가장 자주 등장하는 숫자 순으로 k개수 만큼 반환하기

이정민·2021년 6월 3일
0

Code문제

nums는 숫자로 이루어진 배열이다.
가장 자주 등장하는 숫자 순으로 k개수만큼 return해라

ex)

1번 예시)

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

return [1, 2]
__________________

2번 예시)

nums = [1]
k = 1

return [1]

이 문제를 보자마자 전에 풀었던 '가반수를 차지하는 숫자를 출력해라' 문제에서 풀었던 코드를 사용하면 될 것 같았다.

그때 사용했던 코드를 상기해보자면...(k를 제외하고)

def top_k(num):
	new_nums = {}
	for num1 in nums:
    		try: new_nums[num1] += 1
		except: new_nums[num1] = 1
	new_nums = sorted(new_nums.items(), key=lambda x: x[1], reverse=True)
	return new_nums[0][0]

이 코드에 대한 해석이 필요하다면 여기로!!
https://velog.io/@snowgom/%ED%8C%8C%EC%9D%B4%EC%8D%ACpython-%EC%88%AB%EC%9E%90%EC%A4%91%EC%97%90%EC%84%9C-%EA%B3%BC%EB%B0%98%EC%88%98%EB%A5%BC-%EB%84%98%EB%8A%94-%EC%88%AB%EC%9E%90%EB%A5%BC-%EB%B0%98%ED%99%98%ED%95%98%EA%B8%B0


여기 코드에 더해서 큰 순서대로 k만큼만 뽑아주면 된다고 생각했다.

def top_k(nums, k):
  new_nums = {}
  new_k = []
  mon = []
  for num1 in nums:
    try: new_nums[num1] += 1
    except: new_nums[num1] = 1
  new_nums = sorted(new_nums.items(), key=lambda x: x[1], reverse=True)
  for num2 in range(k):
    new_k.append(num2) 
    mon.append(new_nums[new_k[num2]][0])
  return mon



print(top_k([1,2,3,4,4,4,5,5,5,5,6,2,3,3], 2))

return 값은 [5, 3]

숫자가 몇번 중복됬는지 딕셔너리에 넣고 value값이 큰 순서대로 나열을 한 상태에서 또 다시 for 문을 통해서 range(k)만큼 새로운 리스트에 숫자를 저장한다.
ex) range(2) ==> new_k = [0,1]이 저장되는 식이다.
이후 new_k리스트를 new_nums의 요소를 인덱스 형식으로 뽑아낼때 사용하는 번호로 사용했다.
ex) mon.append(new_nums[new_k의 몇번째 익덱스])
이후 mon을 리턴 하면 성공이다.

코드식이 너무 긴 것 같다.... 다음문제는 코드식을 더 줄여보도록 해보자...

profile
안녕하세요.

0개의 댓글