숫자로 이루어진 배열인 nums를 인자로 전달한다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환하라.
예를 들어,
nums = [3, 2, 3] return 3
nums = [2, 2, 1, 1, 1, 2, 2] return 2
과반이 넘은 숫자를 반환하라고 하는데, 결국 과반이 넘는 수의 후보는 가장 배열에 가장 많이 있는 수이다.
배열에 가장 많이 있는 수가 과반이 될 수도 있고, 안될 수도 있다. 근데 이 문제는 배열에 가장 많이 등장하는 수만 구해도 test case를 모두 통과하고, 심지어 가장 많이 등장하는 수가 과반이 안되도, 그 수를 반환해야 test case를 통과하는 참사가....
결국 문제는 배열에 가장 많이 존재하는 수를 구하는 문제로 바뀌어 버렸다는 것에 대한 아쉬움이 남는다.
def more_than_half(nums):
#step1
result=int(0)
cnt=int(0)
set_nums = set(nums)
#step2
for num in set_nums:
if cnt < nums.count(num):
cnt = nums.count(num)
result = num
#step3
if cnt <= len(nums)/2:
return print("과반수가 넘은 숫자 없음")
return result
과반이 넘는 수를 저장할 result
,
숫자가 배열에 얼마나 들어 있는 지를 담아 비교할 cnt
,
배열에 중복되지 않은 요소만 담을 set_nums
를 선언한다.
def more_than_half(nums):
#step1
result=int(0)
cnt=int(0)
set_nums = set(nums)
def more_than_half(nums):
#... ...#
#step2
for num in set_nums:
if cnt < nums.count(num):
cnt = nums.count(num)
result = num
#... ...#
중복되지 않는 숫자들 로 구성된 set_nums
를 돌면서, 가장 많이 등장하는 숫자를 result
에, 그 수가 배열에 존재하는 횟수를 cnt
에 대입한다.
def more_than_half(nums):
#... ...#
#step3
if cnt <= len(nums)/2:
return print("과반수가 넘게 존재하는 숫자 없음")
return result
가장 많이 존재하는 숫자가 과반이 넘는지 검사하고, 과반이 넘지 않으면 경고 문자를, 과반이 넘으면 그 값을 반환한다.