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

싱숭생숭어·2023년 4월 17일

프로그래머스

목록 보기
4/21

문제

문제 설명

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

제한사항

1. 0 < array의 길이 < 100
2. 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입니다.

※ 공지 - 2022년 10월 17일 제한 사항 및 테스트케이스가 수정되었습니다.


풀이과정

def solution(array):
    dic = dict.fromkeys(array, 0)
    #array에 해당하는 key의 초기 value값을 0로 지정
    for x in array:
        dic[x] += 1
        #value값을 1씩 증가시킴
    a = list(dic.values()).sort()
    convert_dic = {v:k for k,v in dic.items()} 
    #key-value값을 바꾼 dictionary
    if a[-1] == a[-2]:
        return -1
    else:
        return convert_dic[a[-1]]

▶ 만약에 array가 [1]처럼 한자리만 존재하는 list일 경우
a[-1] == a[-2]에서 a[-2]가 존재하지 않으므로
TypeError: 'NoneType' object is not subscriptable 에러가 발생

def solution(array):
    dic = dict.fromkeys(array, 0)
    #array에 해당하는 key의 초기 value값을 0로 지정
    for x in array:
        dic[x] += 1
        #value값을 1씩 증가시킴
    a = sorted(list(dic.values()))
    convert_dic = {v:k for k,v in dic.items()} 
    #key-value값을 바꾼 dictionary
    if len(a) == 1:
        return a[0]
    if a[-1] == a[-2]:
        return -1
    else:
        return convert_dic[a[-1]]

▶ 테스트 9와 10만 실패
-> if len(a) == 1: return a[0]
여기에서 내가 구해야하는 것은 dic의 key값인데, return하는 a는 dic의 value값, 따라서 len(dic.item())이 1 인 반례에 한해서 오류가 발생한 것 !!!

내 풀이

def solution(array):
    dic = dict.fromkeys(array, 0)
    #array에 해당하는 key의 초기 value값을 0로 지정
    for x in array:
        dic[x] += 1
        #value값을 1씩 증가시킴
    a = sorted(list(dic.values()))
    convert_dic = {v:k for k,v in dic.items()} 
    #key-value값을 바꾼 dictionary
    
    if len(a) == 1:
    #배열안의 숫자의 종류가 1개일 때
        return convert_dic[a[0]]  
    else:
    #배열안의 숫자의 종류가 2개 이상일때
    	if a[-1] == a[-2]: 
        #최빈값의 개수가 2개 이상일때
        	return -1
    	else:
        #최빈값의 개수가 1개일때
        	return convert_dic[a[-1]]

다른 풀이(참고)

def solution(array):
    dic = dict.fromkeys(array, 0)
    #array에 해당하는 key의 초기 value값을 0로 지정
    for x in array:
        dic[x] += 1
        #value
    answer = []
    for i in dic.items():
        if i[1] == max(dic.values()):
            answer.append(i[0])
    return answer[0] if len(answer) == 1 else -1

이건 진만오빠가 풀어준 코드 ,,, 여기선 for문을 사용해서 dic안의 item을 하나하나 가져오면서 item의 value값을 max(dic.values())와 같을 경우 answer라는 빈 list안에 append
answer이라는 리스트의 길이가 1이면 answer[0]을 반환, 길이가 2이상일 경우 -1을 반환하는 코드 !!

-> 나는 for문을 쓰기 싫어서 이중 if문을 사용해 반례 여러가지를 넣어주었는데 이럴땐 그냥 for문 쓰는 것도 나쁘지 않은 듯 ...^^

profile
공부합시당

0개의 댓글