2월 22, 2022

[CodeKata] 배열에서 과반수가 넘는 숫자

 첫번째 풀이

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def more_than_half(nums):
    # 아래 코드를 입력해주세요.
    dic = {}     # 숫자와, 그것의 출현횟수 알기 위해 딕셔너리만듬
    for i in set(nums): # 배열 안 숫자들(집합)을 for로 돌려서,
      dic[i] = nums.count(i) 
      # 숫자와(키), 그것의 출현횟수(값) 딕셔너리에 담음
    max_value = max(dic.values()) # 딕셔너리 값들 중 제일 큰 값
    for j in dic.keys(): # 딕셔너리의 키들 중 
      if dic[j] == max_value: # 해당 딕셔너리키가 제일큰값의 키면
        return j  # 리턴해라 조

좀 난잡하게 풀었습니다. set로 nums안 숫자를 추린후, 딕셔너리에 숫자와 그것의 출현횟수를 담고, 딕셔너리의 키 중 가장 큰 value를 가진 키를 리턴해주었습니다.


두번째 풀이 

1
2
3
4
5
def more_than_half(nums):
  dic = {}
  for i in set(nums):
    dic[i] = nums.count(i)
  return [k for k,v in dic.items() if max(dic.values()) == v][0]

풀이 방식은 같은데, 코드가 훨씬 깔끔해졌습니다.

특히, 딕셔너리에서 가장 큰 값을 가진 키를 불러오는 법을 리스트 컴프리헨션 을 가지고 수행했는데, 신선한 접근이었습니다. 

리스트 컴프리헨션을 만들며 고생을 좀 했는데, 왜냐면 k,v in dic 이런식으로 dic.items()가 아닌 딕셔너리 자체를 썼기 때문이다.


dic.itmes()를 프린트해보면 이와 같습니다. 리스트 안에 튜플이 담기는데, 튜플의 앞의 값은 키이고/ 뒤의 값은 1입니다.

만약 이 튜플값을 리턴하고 싶으면, 

def func_1(num1,num2): return num1,num2 result1, result2= func_1(10,20) print(result1) >>10 print(result2) 
>>20 

이런식으로 각각의 변수에 담아 서 각각의 값을 리턴 받을 수도 있다.