본문 바로가기

개발/프로그래머스

[프로그래머스 Lv.0] - 최빈값 구하기

[문제 설명]

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

[제한사항]

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

[입출력 예 설명]

입출력 예 #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입니다.

 

[KANU식 코드]

def solution(array):
    #중복제거
    ar_set = list(set(array))
    if len(ar_set)==1:
        return ar_set[0]
    #중복 제거된 원소들이 array에 각각 몇개 있는지 확인
    ar_count=[]
    for i in range(len(ar_set)):
        count = 0
        for j in range(len(array)):
            if(ar_set[i]==array[j]):
                count = count+1
        ar_count.append(count)
    sort_count = sorted(ar_count)
    if sort_count[-1]==sort_count[-2]:
        return -1
    else:
        return ar_set[ar_count.index(max(ar_count))]

set를 통해서 중복되는 원소들을 제거한 후

각 원소별로의 count를 리스트화 해서

이를 정렬하고, 마지막 두 카운트가 같다면 -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

array의 길이가 0이될때까지 루프

-> array를 집합화 시켜서 enumerate로 인덱스와 객체 뽑아내    #생각해보니까 set하면 애초에 정렬이 되네

-> array에서 모든 집합의 원소를 한번씩 제거                             #이게 아이디어네

-> 이제 set(array)를 했을때 원소가 하나밖에 남지 않는다면 => 최빈값이 두개가 아니라는 얘기, a를 리턴

-> 위의 상황에 걸리지 않는다면 => -1을 리턴

 

어떻게 이런생각이 나는지 신기할 따름