문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
def solution(array):
arr = sorted(array)
answer = {}
cnt = 0
i = 0
while i < len(arr):
cnt = arr.count(arr[i])
answer[arr[i]] = cnt
i += cnt
#가장 큰 값을 가진 키 찾기
#1. 가장 큰 value를 찾기
#2. 그 value를 가진 키 값을 찾기
#3. 만약 여러 개라면 -1 반환
max_value = max(answer.values())
temp = []
for k,v in answer.items():
if max_value == v:
temp.append(k)
if len(temp) > 1:
return -1
return temp[0]
MADE BY ME
입력: array(정수배열)
출력: answer(최빈값) / -1(최빈값 여러개일 때)
1) array의 "원소값:빈도수"를 키-밸류 쌍으로 갖는 딕셔너리 answer를 만듦
2) answer에서 value(빈도수)가 가장 큰 key(원소값)을 찾아 temp 리스트에 보관했다.
다른 코드 인사이트: 내 거랑 뭐가 다를까?
def solution(array):
while len(array) != 0:
for i, a in enumerate(set(array)):
array.remove(a)
if i == 0: return a
return -1
알고리즘 동작 방식: 배열에 존재하는 값을 종류별로 1개씩 지워나가면서 끝까지 살아남는 원소를 찾음
set()으로 배열에 존재하는 값을 1개씩 집합으로 만듦enumerate()로 인덱스(i)와 값(a)을 하나씩 빼내어 array에서 그 값을 하나씩 지워감진짜 리스펙한 코드다...
다만, array.remove()는 O(N)의 시간복잡도를 가져 배열이 커지면 매우 느려지고, for문 밖에서 루프 변수를 사용하는 것은 가독성을 떨어트리므로 좋은 코드는 아니라고 한다..
💡추가로 알게 된 것: 파이썬의 스코프 규칙
"i가 for문 밖에 있는데도 에러 나지 않는 이유"
: C, java와 달리 파이썬은 함수 단위로 스코프(범위)를 관리하기 때문에 for문이나 if문 내부에서 생성된 변수는 블록이 끝나도 사라지지 않고 해당 함수 내에서 계속 유효하다. 다만, for문이 최소 한 번이라도 돌아가야 한다. (안그러면 UnboundLocalError가 발생할 수 있음)