code/[프로그래머스] python

[코딩 테스트 연습 입문] 최빈값 구하기

오리는짹짹 2022. 12. 23. 14:13

문제

최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 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입니다.

 

🔥그동안의 시도

이건 처음에 짰던 코드다. 분명 완벽하다고 생각했는데 런타인에러가 떴다..^^

다시 짜야했고, 어떤 부분에서 줄여볼까 생각을 하다가 초반을 아예 count와 같은 걸로 짜야겠다는 생각이 들었다.

count로 넣었는데 여전히 테스트 8,9,10 실패... 

그렇다면 value_list 부분부터 수정을 봐야하나보다.

더 많은 테스트가 런타임 에러가 떴다. 그럼 어떤 걸 고쳐야할까? 고민하는중...

좀 더 단순하게 생각해야 한다는 압박감이 느껴졌다.

그 후 나온 결과가 바로 아래의 풀이!

 

✔풀이

def solution(array):
    answer = 0
    array_dict={}
    for i in array:
        if i not in array_dict.keys():
            array_dict[i]=array.count(i)
        else:
            pass
    values_array=list(array_dict.values())
    max_value=max(values_array)
    if values_array.count(max_value)>1:
        answer=-1
    else:
        for key,value in array_dict.items():
            if value==max_value:
                answer=key
                break
    return answer

📝설명

너무 어렵게 느껴져서 며칠을 고민했다. 그 과정들을 소개합니다..

문제에서는 최빈값을 retrun 하라고 했다.

큰 그림을 설명하자면, array에서 숫자를 순서대로 꺼내면서 빈 딕셔너리에 key값은 숫자, value는 숫자가 얼마나 등장했는지를 저장하도록 한다. 

딕셔너리의 value값을 따로 부른 값을 values_array에 저장한 후, 가장 큰 값을 max를 이용하여 뽑아내고 따로 저장한다.

뽑아낸 max value값을 value_array에 중복된 값이 있는지 count를 활용하여 개수를 센다.

이 때 결과값이 1을 초과한다면, 최빈값이 여러 개라는 것이니 -1을 return하도록 한다.

만약 결과값이 1이라면, 최빈값이 하나라는 의미이다.

for문을 이용하여 key와 value값을 array_dict에서 동시에 탐색하도록 한다.

여기의 value가 앞서 뽑았던 max_value와 같다면 key값을 출력하도록 한다.

헷갈리지 말아야 하는 부분은 만약 array가 [1,2,3,3]이면 return 값으로 3을 뽑아내야 한다는 것! 절대 3의 최빈값인 2가 아니다.

 

개선한다면?

내가 왜 if에 break를 넣었을까?

 

👑모범 답안

 

👀느낀 점

: 너무 많은 시간을 투자해서 막막하게 느껴지기도 했다.

처음으로 런타임오버..까지 뜨니까 맞은건데도 억울한 느낌도 들었다 ㅋㅋㅋ ㅠㅠ 

내 노력이 부정당한 것 같았는데, 막상 해결하고 나니까 뿌듯하다.

이게 내가 이 길을 선택한 이유이기도 하다.

계속 뿌듯함을 느끼기 위해서는, 내가 발전해야 한다.