[프로그래머스] Lv0_최빈값 구하기

박선영·2023년 10월 11일
0
post-thumbnail

Lv0_최빈값 구하기

📄Description

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.

제한 조건

  • 0 < array의 길이 < 100
  • 0 ≤ array의 원소 < 1000

입출력 예시

arrayresult
[1, 2, 3, 3, 3, 4]3
[1, 1, 2, 2]-1
[1]1

입출력 예 설명
1. [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
2. [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
3. [1]에는 1만 있으므로 최빈값은 1입니다.


🤔생각 정리

  1. collections 모듈의 Counter 클래스 활용하면 되겠네.
  2. 빈도수가 높은 순으로 Counter의 items를 정렬해서 최빈값을 찾으면 되겠네.
  3. 빈도수만 보았을 때 동일한 수가 Counter의 values에 1개만 있다면 최빈값을 여러개 있다면 -1을 리턴하면 되겠네.

💡Pseudo Code💡

1. counter = collections.Counter(array)
2. counter 빈도수 기준 내림차순 정렬
3. counter[0]의 빈도수가 counter.values에서 1개면
4. 		return counter[0]의 정수 값
5. 아니면 return -1

🖥️코드화

from collections import Counter

def solution(array):
    counter = Counter(array)
    # 빈도수 기준 정렬
    cnt = sorted([(n, c) for n, c in counter.items()], 
                key = lambda x: -x[1]) 
    return cnt[0][0] if list(counter.values()).count(cnt[0][1])==1 else -1

📌코드 비교 및 감상

  1. 집합 활용
    집합을 활용해서 중복인 원소들을 제거하면서 마지막에 남은 리스트를 기준으로 결과값을 출력한다.
    집합이 중복된 요소를 제거한다는 점에서 활용할 수 있다는 것은 참신했다. 그렇지만 요소의 개수가 많을 경우 많은 반복이 수행된다는 점에서 좋은 알고리즘인지 아쉬웠다.
def solution(array):
    while len(array) != 0:
        for i, a in enumerate(set(array)):
            array.remove(a)
        if i == 0: return a
    return -1

  1. most_common 메소드 활용
    Counter 클래스에 most_common이라는 빈도가 높은 n개의 값을 출력해주는 메소드를 활용할 수 있다.
    (이런 모듈, 클래스, 메소드 활용하려면 공부를 얼마나 해야하는 걸까..😨)
    코드를 인용하자면 이렇다.
from collections import Counter

def solution(array):
    a = Counter(array).most_common(2) # 빈도수 높은 2개의 값
    if len(a) != 1 and a[0][1] == a[1][1]:
        return -1
    return a[0][0]
profile
데이터를 만지는 사람

0개의 댓글