코테) 최빈값 구하기

HS L·2023년 3월 29일
0

내일배움캠프

목록 보기
16/73
post-custom-banner

문제

최빈값 구하기

최빈값 구하기

시도

  1. 최빈값을 구하기 위해 입력되는 리스트를 for문으로 돌려서 dic 딕셔너리에 나오는 횟수를 value값으로 카운트 해준다.
  2. for문으로 돌린 arr값들이 dic에 존재하지 않을때 value 기본값을 1로 설정하고 arr값이 이미 존재하는 경우 value값을 +1해준다.
  3. dic에서 최빈값을 가지는 숫자를 가져온다.
    • for문으로 다시 돌려서 값을 따져보려 했지만 코드가 길어지고 연산과정도 늘어나기 때문에 다른방법 고민
    • max값을 찾아서 해보려 했지만 value값이 동일한 경우 하나만 출력이 돼서 실패..
    • (해결)value값에 따라 dic를 내림차순으로 정렬하고 최빈값을 가지는 숫자를 가져온다. 이때 동일한 값을 가지는 숫자가 있는경우를 if문으로 판별한다(해결)

해결

def solution(array):
    answer = ''
    dic = {}
    for arr in array:
        if arr in dic:
            dic[arr] += 1
        else:
            dic[arr] = 1
    sorted_dic = sorted(dic.items(), key=lambda item: item[1], reverse=True)
    if len(sorted_dic) > 1:
        if sorted_dic[0][1] == sorted_dic[1][1]:
            answer = -1
        else:
            answer = sorted_dic[0][0]
    else:
        answer = array
    return answer
  • 9번째 행: value값을 기준 내림차순으로 key값을 정렬
    sorted_dic = sorted(dic.items(), key=lambda item: item[1], reverse=True)
    -> sorted_dic = 정렬해라(딕셔너리의 key:value쌍을, key=lambda 가져오는 쌍의 key값 : value값, 내림차순으로)
  • 10행 이후 if문: 정렬한 sorted_dic의 개수가 2개 이상일때
    첫번째와 두번째 숫자의 최빈값이 같은경우 문제에서 요구하는 -1값을 출력하고
    값이 다른경우 최빈값이 가장 높은 첫번째의 숫자를 출력해라
  • 15행 else문: 1개의 array가 입력이 된 경우 그 값이 그대로 최빈값을 가지기 때문에 그대로 array를 출력한다.

알게된점

  • 다른사람의 풀이를 통해 여러 접근방식을 알 수 있었다.
  • 해당 코드는 다른분의 답안코드이다.
    def solution(array):
        while len(array) != 0:
            for i, a in enumerate(set(array)):
                array.remove(a)
            if i == 0: return a
        return -1
	- 이해하기 위해 중간중간 print함수를 사용하여 구조를 분석해보니 while안의 for문이 돌아갈때는 다음과 같다.
    - 4행과 5행의 사이에 print(i, array)를 출력해보면 다음과 같다.
    0 [2, 2, 3, 3, 3, 4, 4, 4, 4]
	1 [2, 3, 3, 3, 4, 4, 4, 4]
	2 [2, 3, 3, 4, 4, 4, 4]
	3 [2, 3, 3, 4, 4, 4]
    >1번째 실행
    
	0 [3, 3, 4, 4, 4]
	1 [3, 4, 4, 4]
	2 [3, 4, 4]
    >while문에 의해 2번째 실행
    
	0 [4, 4]
	1 [4]
    >while문에 의해 3번째 실행
    
	0 []
    4
    >while문에 의해 4번째 실행, i가 0이기 때문에 남아있는 요소 a return결과값
    
    - 첫번째 i가 0일때 set(array)가 {1,2,3,4}로 한바퀴를 돌면서 해당 숫자들을 하나씩 제거하게 된다. 다음 반복진행시 array에서 1이 존재하지 않기때문에 set(array)가 {2,3,4}인채로 다시 for문을 돌게 된다. 
    - 반복해서 진행을 하게 되면 while문이 계속 돌았을때 순번이 계속 줄어들게 되고 i가 0 즉 array의 요소가 하나가 남았을때 그 결과를 return하게 한다.
    
    처음에 보고 와 진짜 신박하다 생각이 들었고 이해하는데 많은 시간을 들였다.. 저렇게 돌려볼 생각조차 나지않아서 처음엔 소름도 돋았다..
    처음 코드의 동작을 이해하려고 출력문을 작성했는데 오히려 그 부분에서 배열의 정렬여부에 집착하면서 헷갈리게 됐던 것 같다. 항상 방심하면 안될 것 같다..
profile
식이
post-custom-banner

0개의 댓글