[leetcode] 상위 K 빈도 요소

김민서·2024년 1월 5일
0

알고리즘 문제풀이

목록 보기
8/47

링크텍스트
nums 배열 안에 가장 많이 들어 있는 값 순서대로 k개를 뽑아 출력하는 문제이다.
나름 고심해서 풀었으나 다른 답안을 찾아본 뒤 힘이 빠진 문제

먼저 내가 처음에 푼 풀이

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

nums = sorted(nums)				# [-1, -1, 1, 2, 3, 4]
c = 1							# 등장 횟수 카운터
count = {c: 1 for c in nums}	# {-1: 1, 1: 1, 2: 1, 3: 1, 4: 1}

for i, num in enumerate(nums):
	if num != nums[i-1]: 
    	c = 1
    if num in nums[i:]:
    	c += 1
        count[num] = c

answer = dic(sorted(count.items(), key=lambda x: x[1], reverse=True))

print(list(answer.keys())[:k]))

먼저 nums를 오름차순으로 정렬한다.
nums를 순회하면서,
해당 숫자와 해당 숫자 이전의 숫자와 같지 않다면 c를 0으로 초기화 처리를 한다.(다른 숫자 등장)
nums를 순회하면서 배열에 해당 숫자가 없으면 c를 증가시킨 후 이를 결과 배열(count)에 담는다.

그 결과, 결과 배열은 이렇게 된다.
{-1: 2, 1: 1, 2: 2, 3: 1, 4: 1}

그리고 이를 오름차순으로 정렬하여 value가 가장 큰 값 순서대로 k개의 key들을 찾아내면 된다. (*가공하는 방법 정리하기)

하지만 정답을 찾아보니 이렇게 풀지 않아도 되었다.
파이썬의 Counter 함수와 most_common(k) 함수를 활용하면 훨씬 간단히 풀 수 있게 된다.
Counter 함수는 문자열 내부에서 특정 문자나 문자열이 포함되어 있는지 계산해 준다.

from collections import Counter
nums = [4,1,-1,2,-1,2,3]
k = 2

cnt = Counter(nums)	 # nums 배열에 각각의 원소가 몇 개 있는지 정리해서 보여준다.
# Counter({-1: 2, 2: 2, 4: 1, 1: 1, 3: 1})

most_common_k = cnt.most_common(k) # 그 중 가장 많이 등장하는 k개의 숫자들을 추출
# [(-1, 2), (2, 2)]

print([num[0] for num in most_common_k]) # 첫번째 요소를 가져와 배열로 만들어 출력 [-1, 2]

0개의 댓글