CodeWars 14 : Highest Rank Number in an Array

김기욱·2021년 6월 30일
0

코딩테스트

목록 보기
53/68
post-custom-banner

문제설명

Complete the method which returns the number which is most frequent in the given input array. If there is a tie for most frequent number, return the largest number among them.
주어진 배열에서 가장 빈도수가 높은 숫자를 return하는 함수를 만드시오. 만약 빈도수가 가장 높은 숫자가 두 개 이상이라면 그 중 가장 큰 숫자를 return 해야 합니다.

제한사항

Note: no empty arrays will be given.
빈 리스트는 주어지지 않습니다.

입출력 예시

[12, 10, 8, 12, 7, 6, 4, 10, 12]              -->  12
[12, 10, 8, 12, 7, 6, 4, 10, 12, 10]          -->  12
[12, 10, 8, 8, 3, 3, 3, 3, 2, 4, 10, 12, 10]  -->   3

풀이

from collections import Counter

def highest_rank(arr):
    most_common_list =  Counter(arr).most_common()
    return max(list(filter(lambda x : x[1] == most_common_list[0][1], most_common_list)), key=lambda x : x[0])[0]
  1. 또하나의 가족 파이썬 모듈..
  2. Counter클래스의 most_common()함수를 사용해서 frequency를 기준으로 내림차순 정렬된 리스트를 만듭니다. 함수가 실행되면 다음과 같이 튜플이 요소로 존재하는 리스트가 완성됩니다.
    [(12, 3), (10, 3), (14, 3), (8, 1), (7, 1), (6, 1), (4, 1)]
  3. 가장 첫 번째에 있는 리스트의 요소의 두 번째 인덱스(1)는 가장 높은 frequency를 가졌습니다. 그러므로 가장 첫 번째 리스트를 기준으로 filter함수로 필터링을 합니다.
    list(filter(lambda x : x[1] == most_common_list[0][1], most_common_list))
  4. 그 다음은 max 함수를 사용해 첫 번째 인덱스(숫자의 크기)가 가장 큰 요소를 추출합니다.
  5. 그럼 (14, 3)이 추출되므로 [0]로 인덱싱하면 원하는 답이 추출됩니다.

다른풀이

from collections import Counter

def highest_rank(arr):
    if arr:
        c = Counter(arr)
        m = max(c.values())
        return max(k for k,v in c.items() if v==m)

로직의 원리는 비슷하지만 훨씬 간결하게 풀이한 해법입니다. 🥳

def highest_rank(a):
    b = set(a)
    c = 0
    for i in b:
        d = a.count(i)
        if d > c or (d == c and i > m):
            c = d
            m = i             
    return m 

모듈도 없이 엄청나게 간단하고 명쾌하게 풀이한 해법이네요. 개인적으로 가장 맘에드는 방식입니다.

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.
post-custom-banner

0개의 댓글