[ Code Kata ] Python #7 리스트 내 과반수 넘는 요소 반환하기

Hailee·2020년 12월 8일
0

[ Code Kata ]

목록 보기
13/28
post-thumbnail

문제

숫자로 이루어진 배열인 nums를 인자로 전달합니다.

  • 숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
    : 예를 들어,
nums = [3,2,3]
return 3
- 
nums = [2,2,1,1,1,2,2]
return 2
-
nums = [3,2,3]
return 3
-
nums = [2,2,1,1,1,2,2]
return 2
  • 가정
    nums 배열의 길이는 무조건 2개 이상

오늘도 역시나 쉽게 풀릴 것 같으면서 막상 생각하려니 비효율적인 식밖에 생각이 안난다

최대한 반복문을 많이 쓰지 않으면서 풀고 싶은데..
list 내 모든 element들을 다 체크하여 dictionary에 담자니
그 이후에도 어떤 key가 가장 값이 큰 value를 가지는지 체크해야하는데,
그럼 너무 많은 연산을 한다고 생각했다.

사실 코드카타는 풀어도 풀어도 정말.. 당장 풀어내려는 것에만 급급하다보니
효율적으로 풀고싶은데, 그러지 못하는 나에게 실망하게 되는 것 같다
(실망하지마아)

내가 푼 코드

def more_than_half(nums):
  half_check = {}

  if len(nums) < 2:
    return nums[0]
  else:
    count_nums = set(nums)
    for i in count_nums:
      half_check[i] = nums.count(i)
    max_key = max(half_check, key=half_check.get)
    return max_key

전에 방문한 적이 있는듯한 dictionary 내 max 값을 구하는 방법에 대한 페이지!

How to find the max value in a dictionary in Python

우선 문제를 보면 '가정'이 있으므로
이 경우만 if문 내로 빼준다.

이후 nums 내에 들어있는 유일한 숫자들만 set 자료구조로 변환해서 확인한 후
추출된 숫자들의 개수만큼 for loop을 돌면서 몇개씩 있는지 확인해서 dictionary 내에 키, 값 구조로 담은 뒤
value가 가장 큰 key의 값을 구해서 해당 max값을 리턴!


But 원래 문제는 함수에 대한 리턴값이 있었다.
그걸 생각해보면... 왠지 이렇게 구구절절 리턴하는 것이 아닌 더 간결한 방법이 있었다는 뜻일까...?
(이렇게 또 혼자 슬퍼지공...)

모델 솔루션 올라오면 글 업데이트해야겠다..!


(+ 8시반 추가)
역시나 세상은 넓고 간결한 코드는 많다

def more_than_half(nums):
	majority_count = len(nums)//2
	for num in nums:
		count = sum(1 for elem in nums if elem == num)
		if count > majority_count:
			return num


#아니면 hashmap
# import collections

# def more_than_half(nums):
# 	counts = collections.Counter(nums)
# 	return max(counts.keys(), key=counts.get)

#아니면 sort
# def more_than_half(nums):
# 	nums.sort()
# 	return nums[len(nums)//2]

역시나 바로 간단하게 리턴하는 식이 있었던 것..!!!
hashmap 나오고 난리났다..
java에서 Map, HashMap 하던 그 hashmap 맞니..?

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글