[CodeKata] 7. more_than_half

chaduri7913·2022년 6월 15일
0

CodeKata

목록 보기
6/18

문제

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

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

예를 들어,

nums = [3,2,3]
return 3

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

nums 배열의 길이는 무조건 2 이상이다.

풀이

  1. 문제의 조건 정리
1) 숫자로 이루어진 배열을 인자로 받는다.
2) 배열의 길이는 2 이상이다.
3) 배열 내 숫자 중 그 숫자의 갯수가 전체 요소의 갯수의 과반수보다 큰 숫자를 반환해라 -> 과반수 이상인 숫자는 배열 내 1개 밖에 없다는 뜻

  1. 조건에 대한 코드 구현 방법 생각
1) 배열의 숫자를 key로 갯수를 value로 받는 dictionary를 만들면 좋을 것 같다.
2) dictionary를 수정할 때 += 1 과 같은 문법이 가능한지 알아보자.
3) 된다면 dictionary를 만들어 모든 값을 받는다.
4) 이후 dictionary에 저장된 숫자의 갯수(value)가 len(nums)/2 보다 큰 지 확인하는 for문을 돌리고 크다면 그 value의 key를 반환한다.

  1. 구현 코드
def more_than_half(nums):
	dict = {}
    
    for num in nums:
    	dict[nums] = 0
        
    for num in nums:
    	dict[nums] += 1 
    # 이렇게 하기 위해서는 dict value값이 정수형 데이터로 선언이 되어 있어야 한다. 그렇기 때문에 위에서 dict[nums] = 0 으로 정수형으로 모든 데이터를 선언한 것이다.
    
    for key in dict:
    	if dict[key] > len(nums)/2:
        	return key

  1. 코드 리뷰
  • dictionary를 선언하는 방법 외에 다른 방법이 있지 않을까?
  • nums의 모든 요소에 대해서 for문을 돌리지 않고 해결하는 방법이 있지 않을까?

  1. 최고의 코드
for i in set(nums):
	if nums.count(i) > len(nums)/2:
    	return i

1) nums 내 모든 요소에 대해서 for문을 돌릴 필요 없이 set(nums)로 중복되지 않은 값에 대해서만 for문을 돌린다.
2) list.count(i)는 list 내 i의 갯수를 반환한다. 이를 이용해서 바로 과반수가 되는지 처리 한다.
3) 넘으면 i를 return 한다.

0개의 댓글