숫자로 이루어진 배열인 nums를 인자로 전달할 때, 숫자 중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
✔️ nums로 [3,2,3]이 전달되면, 3을 반환하고, nums로 [2,2,1,1,1,2,2]이 전달되면 2를 반환한다.
✔️ nums 배열의 길이는 무조건 2개 이상이다.
def more_than_half(nums): # 아래 코드를 입력해주세요. nums_set = set(nums) max_count = 0 # 👈 현재 max_num값의 갯수 max_num = 0 # 👈 현재 가장 많이 나타난 요소 for i in list(nums_set): if nums.count(i) >= max_count: max_count = nums.count(i) max_num = i return max_num nums = [2,2,1,1,1,2,2] print(more_than_half(nums))
✔️ 배열 nums 내의 요소 중 가장 많이 나타나는 요소를 찾아 반환하면 되는 문제로 이해했다.
✔️ 우선 들어온 nums 배열을 set으로 바꿔 중복되지 않은 배열로 바꾼 뒤, for문을 돌리기로 했다.
✔️ 가장 많이 나타난 요소와 그 요수의 count값을 계속 업데이트시키면서 nums_set을 순회하면 가장 많이 나타난 요소를 max_num 이 갖고 있기 떄문에 이를 반환했다.
def more_than_half(nums): nums.sort() # [1, 1, 1, 2, 2, 2, 2] return nums[len(nums)//2] nums = [2,2,1,1,1,2,2] print(more_than_half(nums))
✔️ 두번째 풀이법은 정렬을 한 후 가장 가운데 값을 뽑아내는 것이다.
✔️ 사실 이 방법은 혹시 TEST에 PASS될까 싶어 시도했다. 문제가 너무 간략해서 이해하기 어려웠기 때문이다. 이 문제는 2가지 종류의 값만 배열에 담기는 구조인 것 같다.
✔️ 배열 내 요소가 7개라면 이 길이를 2로 나눈 몫은 3으로 배열 내 4번번째 요소 가르키고, 배열 내 요소가 8개라면 이 길이를 2로 나눈 몫은 4로 배열 내 5번째 요소를 가르킨다.
✔️ 이에 정렬을 해서 가운데 수를 뽑아내면 과반수를 넘는 수가 반환된다.
def more_than_half(nums): return [i for i in nums if nums.count(i)>len(nums)//2][0] nums = [2,2,1,1,1,2,2] print(more_than_half(nums))
✔️ 찬규님의 답안이다. 리스트 컴프리헨션으로 해결한 답안이 영롱해서 정리한다.
✔️ nums 배열의 길이를 2로 나눈 몫보다 현재 i를 카운트한 값이 크다면 그게 답이다.
✔️ 리스트 컴퓨리헨션의 결과는 배열이기 때문에 0번 index 값을 반환하면 된다.
1. sort를 아는것과 쓰는것은 다르다. 다양한 상황에서 어떤 활용성을 가질 수 있는지 익혀가자!