프로그래머스 코딩테스트 입문에서 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
'코딩테스트 > 파이썬 코테' 카테고리의 다른 글
[프로그래머스] 진료순서 정하기 - 파이썬(index함수) (0) | 2023.06.15 |
---|---|
[프로그래머스] 피자나눠먹기(2) - 파이썬(최대공약수, 최소공배수) (1) | 2023.06.08 |
댓글