본문 바로가기
코딩테스트/파이썬 코테

[프로그래머스] 최빈값 구하기 - 파이썬(Counter)

by 코듀킹 2023. 6. 8.

프로그래머스 코딩테스트 입문에서 Lv0에서나오는 최빈값 구하기 문제이다. array리스트 나오는 숫자 중에 최빈값을 리턴하는 문제이다. 파이썬의 Counter 함수를 활용했다. 

 

 

* 이어드림스쿨 3기 참여하면서 진행하고 있는 스터디원 분이 작성한 코드를 제가 풀이한 내용입니다.(23년 6월 7일 코드리뷰 스터디 발표내용)

기존 코드

# Day3 최빈값구하기
from collections import Counter

def solution(arr):	
    cnt = Counter(arr)		
    modes = [k for k, v in cnt.items() if v == max(cnt.values())]	
    return modes[0] if len(modes) == 1 else -1

 

코드 풀이

# Day3 최빈값구하기 Code 풀이(주석참고)

# Collections 모듈의 Counter 함수를 불러왔다. 
from collections import Counter

def solution(arr):	
		# arr 리스트의 숫자들을 카운트해해서 cnt 변수에 저장한다.
    cnt = Counter(arr)		
		# cnt.items()로 각 유니크한 숫자를 k에, 각 숫자의 갯수를 v에 집어넣고,
		# 리스트 컴프리헨션 for문을 돌린다. 
		# 이때, 조건은 v가 cnt에서 가장 많은 숫자의 개수와 똑같다면 그 숫자 k를 modes에 추가한다.
    modes = [k for k, v in cnt.items() if v == max(cnt.values())]	
		# modes에는 최빈값 1개 또는 여러개가 리스트 형태로 저장되어있다. 
		# return으로 modes의 길이가 1이면 modes[0]을 리턴한다.
		# modes는 리스트로 감싸져 있기 때문에 [0]을 같이 써줘야한다.
		# modes의 길이가 1이 아니면 -1를 리턴다.
    return modes[0] if len(modes) == 1 else -1

 

쉽게 풀이한 코드

# Day3 최빈값구하기 Code 쉽게 개선했을 때
from collections import Counter
		## print(Counter(arr)) 예시
		# input: [1, 2, 3, 3, 3, 4]
		# output: Counter({1: 1, 2: 1, 3: 3, 4: 1})

def solution(arr):
    cnt = Counter(arr) #Counter({1: 1, 2: 1, 3: 3, 4: 1})
    modes = [] 
    max_count = max(cnt.values()) # 3

    for k, v in cnt.items(): # dict_items([(1, 1), (2, 1), (3, 3), (4, 1)])
        if v == max_count: # 3 == 3
            modes.append(k) # 3

    if len(modes) == 1:
        return modes[0]
    else:
        return -1

댓글