Code Kata 2-4

chaerin·2021년 2월 7일
0

CodeKata

목록 보기
4/4

가장 많이 나온 숫자를 k번째까지 출력하기

문제

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

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

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

return [1,2]

nums = [1]
k = 1

return [1]

풀이

collections 모듈의 Counter 클래스를 사용해 볼 것

collections 모듈의 Counter 클래스를 사용하기 위해 제일 상단에 불러온다.

from collections import Counter

Counter는 리스트나 문자열과 같은 시퀀스 자료형 안의 요소 중 값이 같은 것이 몇 개 있는지 반환해준다.

값의 개수를 담고 있는 딕셔너리 cnt를 만들어준다.

>>> nums = [2, 2, 2, 2, 3, 3, 1, 2, 1, 3]

>>> cnt = Counter(nums)
>>> print(cnt)

Counter({2: 5, 3: 3, 1: 2})

nums라는 리스트를 위와 같이 주고 Counter를 이용해 결과를 확인해 보면 값의 개수(value값)를 기준으로 정렬되어 딕셔너리 형태로 반환된 것을 확인할 수 있다.

정렬하기

객체의 데이터 중에서 특정한 데이터를 기준으로 정렬하기 위해 key 매개변수로 정렬을 하기 전에 각 요소에 대하여 적용되는 함수를 지정할 수 있다.

result = sorted(cnt, key=lambda x: cnt[x], reverse=True)[:k]

lambda는 정렬을 하기 전에 호출되는 함수를 나타낸 것이다.

value값을 기준으로 정렬하기 위해 cnt요소를 받아서 cnt의 value값 즉, cnt[x]를 정렬 기준으로 정한다.

개수가 많은 것부터 적은 것 순으로 정렬(내림차순 정렬) 해야 하므로 reverse=True를 넣어준다.

여기까지의 진행상태로 결과값을 확인해보면 아래와 같은 결과가 나온다.

[2, 3, 1]

하지만 우리는 특정값 k를 주면 그에 해당하는 개수만큼의 숫자를 반환해야 하므로 [:k]를 이용하여 k-1번째까지의 숫자, k개수만큼의 숫자를 반환할 수 있다.

총정리

from collections import Counter
def top_k(nums, k):
    cnt = Counter(nums)
    result = sorted(cnt, key=lambda x: cnt[x], reverse=True)[:k]

    return result

0개의 댓글