숫자로 이루어진 배열인 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 맞니..?