Code Kata 과반수 찾기

Jaeyong Park·2021년 11월 28일
0

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

숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.

예를 들어,

nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2
copied!
nums = [3,2,3]
return 3

nums = [2,2,1,1,1,2,2]
return 2

접근을 어떻게 해야할지 몰라서 처음이 조금 애매했던 것 같다.
만약 [1,1,1,2,2,2,3,3,3,4,4,4] 처럼 과반수가 없다면 무엇을 return 해줘야될까? 라는 고민을 하다가 테스트 코드를 돌려보고 과반수가 모든 list안에 있는 것을 보고 일단 more than a half가 있다고 접근했다.

그렇게 생각하니까 조금은 간편해졌다.

내가 푼 코드

def more_than_half(nums):
    nums.sort()
    half_num = (len(nums)//2)
    return nums[half_num]

함께 하던 파트너가 sort 라는 것을 던져줬다. 아! 그러면 알아서 순서대로, 묶인 것 끼리 배열이 된다.
그렇다면 무조건 과반수가 넘는 숫자는 정렬된 리스트의 '정중앙' 에 오게 된다.
[1,2,3,2,3,2,1,2,2,3,2,2,1,2,2] 를 예로 보면 sort를 하면
[1,1,1,2,2,2,2,2,2,2,2,2,3,3,3]이 된다
즉 앞이나 뒤와 관계없이 무조건 중간 값에는 과반수의 숫자가 올 수밖에 없는 구조여서 sort를 한 후
len(nums)의 절반 중 // 으로 버림을 취하게 되면 홀수인 경우는 정확하게 절만인 녀석이 반환된다.(//2면 버림인데 15이라 치면 7.5 --> 7이 나오고 index로 하면 8번째, 즉 정 중앙의 값이 나온다)

그리고 짝수인 경우도 절반 +1 의 idx값이 나오게 되어 큰 상관이 없다.

다른 풀이들을 보자.

def more_than_half(nums):
	harf_n = len(nums) // 2
	set_list = set(nums)
	
	for i in set_list:
	  if nums.count(i) >= harf_n:
	    return i

과반수의 최소 숫자를 정하고, 리스트를 셋으로 설정한다음
셋리스트를 for문으로 돌리면서 count 함수를 이용하여, 과반수의 숫자를 구하였다.

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

모범답안이라는데 뭐가 모범인지는 솔직하게 잘 모르겠다. 큰 차이가 있나...? 타이머를돌려봐야 알 듯.

1줄코드

def more_than_half(nums):
	return [item for item in set(nums) if nums.count(item)> (len(nums)/2)][0]

세상은 넓고 또라이는 많다.

profile
01 Hello World. Login

0개의 댓글