링크텍스트
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]